Go語言中陣列和slice的區別

2021-08-09 21:10:54 字數 3164 閱讀 8256

go語言中陣列是具有固定長度而且擁有零個或者多個相同或相同資料型別元素的序列。由於陣列長度固定,所以在go語言比較少直接使用。而slice長度可增可減,使用場合比較多。更深入的區別在於:陣列在使用的過程中都是值傳遞,將乙個陣列賦值給乙個新變數或作為方法引數傳遞時,是將源陣列在記憶體中完全複製了乙份,而不是引用源陣列在記憶體中的位址。為了滿足記憶體空間的復用和陣列元素的值的一致性的應用需求,slice出現了,每個slice都是都源陣列在記憶體中的位址的乙個引用,源陣列可以衍生出多個slice,slice也可以繼續衍生slice在理解slice之前,我們還是了解下陣列。

go語言陣列中每個元素是按照索引來訪問的,索引從0到陣列長度減1。go語言內建函式len可以返回陣列中的元素個數。

初始化

陣列初始化的方式:

var a [3] int   //3個整數型的陣列,初始值是3個0

arr:=[5]int //長度為5

var array2 = [...]int //不宣告長度

q := [...] int //不宣告長度

r := [...] int //長度為100的陣列,只有最後乙個是-1,其他都是0

總之,初始化方式有四種,二二組合:(不)指定長度*初始化部分、全部元素。

go語言中陣列也可以作為引數:

package main 

import

"fmt"

func modify_arr(array [5]int)

func main()

modify_arr(arr)

fmt.println("in main,array values is:",arr)

}

slice表示乙個擁有相同型別元素的可變長度序列。slice通常被寫為t,其中元素的型別都是t;它看上去就像沒有長度的陣列型別。

陣列和slice其實是緊密關聯的。slice可以看成是一種輕量級的資料結構,可以用來訪問陣列的部分或者全部元素,而這個陣列稱之為slice的底層陣列。slcie有三個屬性:指標,長度和容量。指標指向陣列的第乙個可以從slice中訪問的元素,這個元素不一定是陣列的第乙個元素。長度指的是slice中的元素個數,不能超過slice的容量。指標通常是從指向陣列的第乙個可以從slice中訪問的元素,這個元素不一定是陣列的第乙個元素。長度指的是slice中的元素個數,它不能超過slice的容量。容量的大小通常大於等於長度,會隨著元素個數增多而動態變化。go語言的內建函式len 和 cap 用來返回slice的長度和容量。

初始化

slice初始化的方式:

s1 := int

//注意與陣列初始化的區別,在記憶體中構建乙個包括有3個元素的陣列,然後將這個陣列的應用賦值給s這個slice

a := [10]int

//a是陣列

s2 := a[2

:8] //從陣列中切片構建slice

s3 := make(int,10,20) //make函式初始化,len=10,cap=20

len和cap關係

在追加元素時,如果容量cap不足時,cap一般變為原來的2倍來實現擴容,見以下**最後兩個輸出:

package main 

import

"fmt"

func print_info(my_sliceint)

}func main()

my_slice02:=make(int

,5) my_slice03:=make(int

,5,6)

,9,10)

print_info(my_slice01)

print_info(my_slice02)

print_info(my_slice03)

print_info(my_slice04)

}

以上**的輸出如下:

len : 5

cap : 5

element[ 0 ]= 1

element[ 1 ]= 2

element[ 2 ]= 3

element[ 3 ]= 4

element[ 4 ]= 5

len : 5

cap : 5

element[ 0 ]= 0

element[ 1 ]= 0

element[ 2 ]= 0

element[ 3 ]= 0

element[ 4 ]= 0

len : 5

cap : 6

element[ 0 ]= 0

element[ 1 ]= 0

element[ 2 ]= 0

element[ 3 ]= 0

element[ 4 ]= 0

len : 8

cap : 12

element[ 0 ]= 0

element[ 1 ]= 0

element[ 2 ]= 0

element[ 3 ]= 0

element[ 4 ]= 0

element[ 5 ]= 8

element[ 6 ]= 9

element[ 7 ]= 10

slice的cap擴容規則:

slice做函式引數

注意和陣列作為函式引數的區別:

// slice01

package main

import (

"fmt"

)func main()

var b = a[0

:3] var c = [...]int

d := c[0

:2] sliceinfo(b)

fmt.printf("sum of b is %d\n", sum(b))

fmt.printf("sum of d is %d\n", sum(d))

}func sum(a int) int

return s

}func sliceinfo(x int)

go語言中slice的實現

slice是我們使用go語言時最經常使用的資料結構,所以我們還是有必要研究一下它的實現的,尤其是slice的擴容,具體實現參考src runtime slice.go。slice定義 type slice struct根據growslice函式的名稱,可以很容易的猜到這就是slice擴容的實現。if...

Go語言中Slice(切片)初探

最近上課學習go語言,看go語言指南,裡面說 乙個 slice 會指向乙個序列的值,並且包含了長度資訊,為了指定容量,可傳遞第三個引數到 make。感覺有些懵比,指向乙個序列的值?指定容量?我就在go指南上互動的地方做了點嘗試。本人蒟蒻,如有錯誤,希望大佬指出的時候不要激動。乙個slice 切片 是...

十六 GO語言的陣列和切片 slice

1.陣列 陣列可以存放多個同樣的資料型別資料,陣列也是一種資料型別,在go中,陣列是值型別 陣列的定義 語法 var 陣列名 陣列大小 資料型別 示例 var array 5 int 賦值 array 0 1 a 1 30 中括號中輸入的是陣列中元素的下標,從0開始,0就是第乙個元素 上圖中,前面三...