go語言資料型別之切片slice

2021-10-11 02:58:54 字數 2377 閱讀 2570

初識

slice(切片)代表變長的序列,序列中每個元素都有相同的型別。乙個slice型別一般寫作t,其中t代表slice中元素的型別;slice的語法和陣列很像,只是沒有固定長度而已,slice在底層引用了乙個陣列物件。

slice的長度對應slice中元素的數目;

長度不能超過容量,容量一般是從slice的開始位置到底層資料的結尾位置。內建的len和cap函式分別返回slice的長度和容量。

slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用於建立乙個新的slice,引用s的從第i個元素開始到第j-1個元素的子串行。

切片操作超出cap(s)的上限將導致乙個panic異常,但是超出len(s)則是意味著擴充套件了slice

我們先定義乙個底層陣列:

months :=

[...

]string

讓我們分別定義表示第二季度和北方夏天月份的slice,它們有重疊部分:

我們可以看到,切片操作s[i:j]返回新的slice,它的長度len是j-i,它的容量cap是底層陣列的長度減去開始擷取的元素所在的索引 i

兩個slice之間不能做比較,slice唯一合法的操作是和nil做比較,例如:

if summer ==

nil

如果你需要測試乙個slice是否是空的,使用len(s) ==0 來判斷,而不是 s == nil來判斷。

下面的例子,展示了slice底層公用乙個陣列

func

main()

func

main()

s =(s, s2...

)// [1 2 3 4 5 6 7]

}

var cityslice [

]string

// 追加乙個元素

cityslice =

(cityslice,

"北京"

)// 追加多個元素

cityslice =

(cityslice,

"上海"

,"廣州"

,"深圳"

)// 追加切片

a :=

string

cityslice =

(cityslice, a...

)fmt.

println

(cityslice)

//[北京 上海 廣州 深圳 成都 重慶]

go語言內建的copy()函式可以迅速地將乙個切片的資料複製到另外乙個切片空間中,copy()函式的使用格式如下:

copy

(destslice, srcslice [

]t)

示例:

func

main()

c :=

make([

]int,5

,5)copy

(c, a)

//使用copy()函式將切片a中的元素複製到切片c

fmt.

println

(a)//[1 2 3 4 5]

fmt.

println

(c)//[1 2 3 4 5]

c[0]=

1000

fmt.

println

(a)//[1 2 3 4 5]

fmt.

println

(c)//[1000 2 3 4 5]

}

go語言沒有提供刪除元素的函式,我們根據slice本身特性來刪除

func

main()

// 要刪除索引為2的元素

a =(a[:2]

, a[3:

]...

) fmt.

println

(a)//[30 31 33 34 35 36 37]

}

go語言資料型別之數值型別

整型 整型分為以下兩個大類 按長度分為 int8 int16 int32 int64 對應的無符號整型 uint8 uint16 uint32 uint64 其中,uint8就是我們熟知的byte型 var a int 10 fmt.printf d n a 浮點型 go語言支援兩種浮點型數 flo...

go語言資料型別之指標

初識 任何程式資料載入記憶體後,在記憶體都有他們的位址,這就是指標。而為了儲存乙個資料在記憶體中的位址,我們就需要指標變數。go語言中的指標不能進行偏移和運算,因此go語言中的指標操作非常簡單,我們只需要記住兩個符號 取位址 和 根據位址取值 go語言中的值型別 int float bool str...

Go語言資料型別

go語言任何乙個變數都有乙個型別。go語言的資料型別分為基礎型別 引用型別 結構型別 基礎型別 數值型別 字元型別 字串型別 布林型別 陣列型別 引用型別 切片 map channel inte cce型別 結構型別 結構體go語言整型分為有符號 無符號型別兩大型別 有符號整數型別 既可以支援正數也...