golang-12- 數組slice

Go 語言提供了數組類型的數據結構。

數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,這種類型可以是任意的原始類型例如整形、字符串或者自定義類型。

相對於去聲明 number0, number1, ..., number99 的變量,使用數組形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易於擴展。

數組元素可以通過索引(位置)來讀取(或者修改),索引從 0 開始,第一個元素索引為 0,第二個索引為 1,以此類推。

golang-12- 數組slice

1、類型 [n]T 是一個有 n 個類型為 T 的值的數組。

<code>//表達式var a [10]int    //定義變量a是一個有10個整數的數組。//示例func main() {var a [2]string   //定義一個有2個string類型的數組a[0] = "Hello"  //第一個值賦值Helloa[1] = "World"  //第二個值賦值Worldfmt.Println(a[0], a[1])  //輸出數組的第一個,第二個值fmt.Println(a)  //直接輸入數組}/<code>

數組的長度是其類型的一部分,因此數組不能改變大小。 這看起來是一個制約,但是請不要擔心; Go 提供了更加便利的方式來使用數組。

2、數組初始化

初始化數組中 {} 中的元素個數不能大於 [] 中的數字。

如果忽略 [] 中的數字不設置數組大小,Go 語言會根據元素的個數來設置數組的大小:

<code>import "fmt"func main() {p := []int{2, 3, 5, 7, 11, 13}     // [] 中設置數組大小,根據{}裡面判斷數組的長度fmt.Println("p ==", p)           //直接輸出數組  p == [2 3 5 7 11 13]for i := 0; i < len(p); i++ {      //  遍歷數組fmt.Printf("p[%d] == %d\\n", i, p[i])}}/<code>

3、切片slice

數組的長度在定義之後無法修改。數組是值類型,每次傳遞都將產生一份副本。顯然這無法滿足開發者的某些需求。Go語言提供了數組切片(slice)來彌補數組的不足。數組和slice之間有著緊密的聯繫,一個slice是一個輕量級的數據結構,提供了訪問數組子序列元素的功能,而且slice的底層確實引用一個數組對象。

<code>var slice []int   //數組切片與數組聲明非常相似,唯一區別是無需指定長度/<code>

4、slice 可以重新切片,創建一個新的 slice 值指向相同的數組

<code>import "fmt"func main() {p := []int{2, 3, 5, 7, 11, 13}   fmt.Println("p[1:4] ==", p[1:4])     //取從下標1到4的 slice 元素  //p[1:4] == [3 5 7]fmt.Println("p[:3] ==", p[:3])  // 省略下標代表從 0 開始  //p[:3] == [2 3 5]fmt.Println("p[4:] ==", p[4:])  // 省略上標代表到 len(s) 結束  //p[4:] == [11 13]}/<code>

5、直接創建切片

slice 由函數 make 創建。這會分配一個零長度的數組並且返回一個 slice 指向這個數組。

make()函數創建一個指定元素類型、長度和容量的slice。容量部分可以省略,在這種情況下,容量將等於長度。在底層,make創建了一個匿名的數組變量,然後返回一個slice。只有通過返回的slice才能引用匿名的數組變量

<code>import "fmt"func main() {a := make([]int, 5)      //    len(a)=5     分配了一個長度為5的數組 。int  默認值為0  printSlice("a", a)        //     a len=5 cap=5 [0 0 0 0 0]       b := make([]int, 0, 5)    //       len(b)=0, cap(b)=5    ,容量是5 長度為0 不能進行操作printSlice("b", b)            //b len=0 cap=5 []   c := b[:2]           //重新切片,創建一個新的slice ,len=2   指向原來的數組 cap=5printSlice("c", c)    //c  len=2 cap=5 [0 0]  d := c[2:5]            //重新切片printSlice("d", d)    //d len=3 cap=3 [0 0 0]}func printSlice(s string, x []int) {fmt.Printf("%s len=%d cap=%d %v\\n",s, len(x), cap(x), x)}/<code>

6、slice 的零值是 `nil`,一個 nil 的 slice 的長度和容量是 0

<code>//示例一:未賦值 func main() {var z []int                            //未賦初始值  fmt.Println(z, len(z), cap(z))   //輸出結果    [] 0 0if z == nil {             //條件成立fmt.Println("nil!")  }}//示例二:切片定義全零func main() {var z []int=make([]int,0,0)   fmt.Println(z, len(z), cap(z))    //  輸出結果   [] 0 0 if z == nil {fmt.Println("nil!")}else{             //條件成立 fmt.Println("nil2")  // }}/<code> 

7、向 slice 添加元素

向 slice 添加元素是一種常見的操作,因此 Go 提供了一個內建函數 `append`

<code>

append 的第一個參數 s 是一個類型為 T 的數組,其餘類型為 T 的值將會添加到 slice。

append 的結果是一個包含原 slice 所有元素加上新添加的元素的 slice。

如果 s 的底層數組太小,而不能容納所有值時,會分配一個更大的數組。 返回的 slice 會指向這個新分配的數組。

<code>import "fmt"func main() {var a []int        printSlice("a", a)   //   a len=0 cap=0 []  初始容量為0a = append(a, 0)    //  len=1 cap=1  分配一個更大的數組,添加一個元素0printSlice("a", a) //a len=1 cap=1 [0]a = append(a, 1)   // len=2 cap=2  分配一個更大的數組,添加一個元素1printSlice("a", a)  //a len=2 cap=2 [0 1]a = append(a, 2, 3, 4)  //添加多個元素printSlice("a", a)   //a len=5 cap=6 [0 1 2 3 4]}func printSlice(s string, x []int) {fmt.Printf("%s len=%d cap=%d %v\\n",s, len(x), cap(x), x)}/<code>


分享到:


相關文章: