go 語言切片是對陣列的抽象。 go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片("動態陣列"),與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大
切片是一種方便、靈活且強大的包裝器。切片本身沒有任何資料。它們只是對現有陣列的引用。
切片與陣列相比,不需要設定長度,在中不用設定值,相對來說比較自由
從概念上面來說slice像乙個結構體,這個結構體包含了三個元素:
指標,指向陣列中slice指定的開始位置
長度,即slice的長度
最大長度,也就是slice開始位置到陣列的最後位置的長度
定義切片
var identifier type
切片不需要說明長度。 或使用make()函式來建立切片:
var slice1 type = make(type, len)
也可以簡寫為
slice1 := make(type, len)
make(t, length, capacity)
初始化
s[0] = 1
s[1] = 2
s[2] = 3
s := int
s := arr[startindex:endindex]
將arr中從下標startindex到endindex-1 下的元素建立為乙個新的切片(前閉後開),長度為endindex-startindex
s := arr[startindex:]
預設endindex時將表示一直到arr的最後乙個元素
s := arr[:endindex]
預設startindex時將表示從arr的第乙個元素開始
package main
import (
"fmt")
func main()
var b int = a[1:4] //creates a slice from a[1] to a[3]
fmt.println(b)
}
slice沒有自己的任何資料。它只是底層陣列的乙個表示。對slice所做的任何修改都將反映在底層陣列中。
示例**:
package main
import (
"fmt")
func main()
dslice := darr[2:5]
fmt.println("array before",darr)
for i := range dslice
fmt.println("array after",darr)
}
執行結果:
array before [57 89 90 82 100 78 67 69 59]
array after [57 89 91 83 101 78 67 69 59]
當多個片共享相同的底層陣列時,每個元素所做的更改將在陣列中反映出來。
示例**:
package main
import (
"fmt")
func main()
nums1 := numa[:] //creates a slice which contains all elements of the array
nums2 := numa[:]
fmt.println("array before change 1",numa)
nums1[0] = 100
fmt.println("array after modification to slice nums1", numa)
nums2[1] = 101
fmt.println("array after modification to slice nums2", numa)
}
執行結果:
array before change 1 [78 79 80]
array after modification to slice nums1 [100 79 80]
array after modification to slice nums2 [100 101 80]
切片的長度是切片中元素的數量。切片的容量是從建立切片的索引開始的底層陣列中元素的數量。
切片是可索引的,並且可以由 len() 方法獲取長度 切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少
package main
import "fmt"
func main()
func printslice(x int)
執行結果
len=3 cap=5 slice=[0 0 0]
空切片
乙個切片在未初始化之前預設為 nil,長度為 0
package main
import "fmt"
func main() }
func printslice(x int)
執行結果
len=0 cap=0 slice=
切片是空的
package main
import "fmt"
func main()
printslice(numbers)
/* 列印原始切片 */
fmt.println("numbers ==", numbers)
/* 列印子切片從索引1(包含) 到索引4(不包含)*/
fmt.println("numbers[1:4] ==", numbers[1:4])
/* 預設下限為 0*/
fmt.println("numbers[:3] ==", numbers[:3])
/* 預設上限為 len(s)*/
fmt.println("numbers[4:] ==", numbers[4:])
numbers1 := make(int,0,5)
printslice(numbers1)
/* 列印子切片從索引 0(包含) 到索引 2(不包含) */
number2 := numbers[:2]
printslice(number2)
/* 列印子切片從索引 2(包含) 到索引 5(不包含) */
number3 := numbers[2:5]
printslice(number3)}
func printslice(x int)
執行結果
len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len=0 cap=5 slice=
len=2 cap=9 slice=[0 1]
len=3 cap=7 slice=[2 3 4]
package main
import "fmt"
func main()
func printslice(x int)
執行結果
len=0 cap=0 slice=
len=1 cap=2 slice=[0]
len=2 cap=2 slice=[0 1]
len=5 cap=8 slice=[0 1 2 3 4]
len=5 cap=12 slice=[0 1 2 3 4]
numbers1與numbers兩者不存在聯絡,numbers發生變化時,numbers1是不會隨著變化的。也就是說copy方法是不會建立兩個切片的聯絡的
golang學習筆記 slice
go 語言中的slice型別可以理解為是陣列array型別的描述符,包含了三個因素 指向底層陣列的指標 slice目前使用到的底層陣列的元素個數,即長度 底層陣列的最大長度,即容量 因此當我們定義乙個切片變數,s make int,5,10 即為指向了乙個最大長度為10的底層陣列,目前切片s使用到的...
golang學習(九) 切片(slice)
在go 語言中,陣列是值型別,長度是固定的 而切片是引用型別,長度可動態增長。切片的內部結構包括位址 大小和容量。特性 1.當省略開始位置時,表示從連續區域開頭到結束位置。2.當省略結束位置時,表示從開始位置到整個連續區域結束位置。3.兩者都省略時,與切片本身等效。基本格式如下 slice 開始位置...
golang學習筆記 slice 2
array是固定長度的陣列,slice是對array的擴充套件,本質上是基於陣列實現的,主要特點是定義完乙個slice變數之後,不需要為它的容量而擔心。array與slice的差別 1 array是固定長度,slice是可變長度 2 array是值型別,slice是引用型別 slice 結構 typ...