片斷 是 Go 中一個重要的資料類型,它提供的序列介面比陣列強大。
|
|
|

package main
|
|
import (
"fmt"
"slices"
)
|
|
func main() {
|
跟陣列不同的是,片斷只受包含的元素類型限制(而不是元素數量)。未初始化的片斷等於 nil,且長度為 0。
|
var s []string
fmt.Println("uninit:", s, s == nil, len(s) == 0)
|
如要建立一個非零長度的空片斷,請使用內建的 make 。在此我們建立一個長度為 3 的 string 片斷(最初為零值)。預設情況下,新片斷的容量等於其長度;如果我們知道片斷會提前增長,則可以明確將容量作為一個額外的參數傳遞給 make 。
|
s = make([]string, 3)
fmt.Println("emp:", s, "len:", len(s), "cap:", cap(s))
|
我們可以像在陣列中一樣設定和取得。
|
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("set:", s)
fmt.Println("get:", s[2])
|
len 如預期般傳回片斷的長度。
|
fmt.Println("len:", len(s))
|
除了這些基本操作外,片斷還支援多項其他操作,讓它們比陣列更豐富。其中之一是內建的 append ,它會傳回一個包含一個或多個新值的片斷。請注意,我們需要接受 append 的傳回值,因為我們可能會得到一個新的片斷值。
|
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)
|
片斷也可以 copy 。在此,我們建立一個與 s 長度相同的空片斷 c ,然後將 s 複製到 c 。
|
c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:", c)
|
片斷支援「片斷」運算子,語法為 slice[low:high] 。例如,這會取得一個包含元素 s[2] 、s[3] 和 s[4] 的片斷。
|
l := s[2:5]
fmt.Println("sl1:", l)
|
這個片斷會到(但不包含)s[5] 。
|
l = s[:5]
fmt.Println("sl2:", l)
|
而這個片斷會從(包含)s[2] 往後切。
|
l = s[2:]
fmt.Println("sl3:", l)
|
我們也可以在一行中宣告並初始化一個片斷變數。
|
t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)
|
slices 套件包含許多對片斷有用的公用程式函式。
|
t2 := []string{"g", "h", "i"}
if slices.Equal(t, t2) {
fmt.Println("t == t2")
}
|
片斷可以組成多維資料結構。與多維陣列不同,內部片斷的長度可以不同。
|
twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
|