go slice

切片創建和初始化

slice := make([]string, 5)

slice := make([]int,3,5)

slice := []int{1,2,3}

如果只指定長度,那么切片的容量和長度相等。也可以分別指定長度和容量

// 創建一個整型切片, 長度為3個元素,容量為5個元素

slice := make([]int, 3, 5)

// 創建一個整型切片 ,長度和容量都是4個元素

slice := []int{10, 20, 30, 40}

不允許創建容量小于長度的切片,

容量小于長度的切片會在編譯時報錯

// 創建一個整型切片 , 使其長度大于容量

slice := make([]int, 5, 3)

Compiler Error:

len larger than cap in make([]int)


slice 常用賦值方式

1 通過index賦值

s := make([]string, 3)

s[0] = "a"

s[1] = "b"

s[2] = "c"

2 通過append賦值

相對于這些基本的操作,slices支持一些更加復雜的功能。有一個就是內置的append,可以在現有的slice對象上添加一個或多個值。注意要對返回的append對象重新賦值,以獲取最新的添加了元素的slice對象。

? ? s = append(s, "d")

? ? s = append(s, "e", "f")

? ? fmt.Println("apd:", s)


import "sort"

var m map[int]string

var keys []int

for k := range m {

? ? keys = append(keys, k)

}

sort.Ints(keys)

for _, k := range keys {

? ? fmt.Println("Key:", k, "Value:", m[k])

}


切片迭代

// 迭代每個元素,并顯示值和地址

for index, value := range slice {

  fmt.Printf("Value: %d Value-Addr: %X ElemAddr: %X\n",

    value, &value, &slice[index])

}

Output:

Value: 10 Value-Addr: 10500168 ElemAddr: 1052E100

Value: 20 Value-Addr: 10500168 ElemAddr: 1052E104

Value: 30 Value-Addr: 10500168 ElemAddr: 1052E108

Value: 40 Value-Addr: 10500168 ElemAddr: 1052E10C

因為迭代返回的變量是一個迭代過程中根據切片依次賦值的新變量,所以value的地址總是相同的。要想獲取每個元素的地址,可以使用切片變量和索引值。

如果不需要索引值,可以使用占位字符來忽略這個值,使用空白標識符(下劃線)來忽略索引值

// 創建一個整型切片,長度和容量都是4個元素

slice := []int{10, 20, 30, 40}

/ /迭代每個元素,并顯示其值

for _, value := range slice {

  fmt.Printf("Value: %d\n", value)

}

Output:

Value: 10

Value: 20

Value: 30

Value: 40


空切片

有時,程序可能需要聲明一個值為nil的切片(也稱nil切片)。只要在聲明時不做任何初始化,就會創建一個nil切片。

// 創建nil整型切片

var slice []int

在Go語言里,nil切片是很常見的創建切片的方法。nil切片可以用于很多標準庫和內置函數。在需要描述一個不存在的切片時,nil切片會很好用。例如,函數要求返回一個切片但是發生異常的時候

// 使用make創建空的整型切片

slice := make([]int, 0)

// 使用切片字面量創建空的整型切片

slice := []int{}

空切片在底層數組包含0個元素,也沒有分配任何存儲空間。想表示空集合時空切片很有用,例如,數據庫查詢返回0個查詢結果時。

圖片發自簡書App
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容