golang-切片slice的基本介紹
Go語言中的切片(slice)基礎
引子
在Go語言中,數組的長度是固定的,且數組長度屬于類型的一部分。這種特性限制了數組的靈活性,無法動態擴容,對復雜情況難以適用。
切片的定義
切片(Slice)是一個擁有相同類型元素的可變長度的序列。它基于數組類型進行了封裝,具有很大的靈活性,支持自動擴容。切片是引用類型,內部結構包含地址、長度和容量。通常用于快速操作一塊數據集合。
聲明切片的語法如下:
var name []T
其中name表示變量名,T表示切片中的元素類型。示例如下:
func main() {
var a []string //聲明一個字符串切片
var b = []int{} //聲明一個整型切片并初始化
var c = []bool{false, true} //聲明一個布爾切片并初始化
fmt.Println(a) //[]
fmt.Println(b) //[]
fmt.Println(c) //[false true]
fmt.Println(a == nil) //true
fmt.Println(b == nil) //false
fmt.Println(c == nil) //false
}
切片的長度和容量
切片擁有自己的長度和容量。可以使用內置的len()函數求長度,使用內置的cap()函數求容量。
切片表達式
切片表達式用于從字符串、數組、指向數組的指針或切片中構造子字符串或切片。切片表達式有兩種形式:簡單形式和完整形式。
簡單切片表達式
切片基于數組,可以通過切片表達式得到。切片表達式中的low和high表示一個索引范圍(左包含,右不包含),例如:
func main() {
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3]
fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
}
輸出結果:
s:[2 3] len(s):2 cap(s):4
可以省略切片表達式中的任何索引:
a[2:] // 等同于 a[2:len(a)]
a[:3] // 等同于 a[0:3]
a[:] // 等同于 a[0:len(a)]
完整切片表達式
對于數組、指向數組的指針或切片,支持完整切片表達式:
a[low : high : max]
例如:
func main() {
a := [5]int{1, 2, 3, 4, 5}
t := a[1:3:5]
fmt.Printf("t:%v len(t):%v cap(t):%v\n", t, len(t), cap(t))
}
輸出結果:
t:[2 3] len(t):2 cap(t):4
使用make()函數構造切片
make()函數用于動態創建一個切片:
a := make([]int, 2, 10)
fmt.Println(a) //[0 0]
fmt.Println(len(a)) //2
fmt.Println(cap(a)) //10
切片的本質
切片的本質是對底層數組的封裝,包含底層數組的指針、切片的長度(len)和切片的容量(cap)。
判斷切片是否為空
檢查切片是否為空,應該使用len(s) == 0而不是s == nil。
切片不能直接比較
切片之間不能直接使用==操作符比較,只能與nil比較。
切片的賦值與拷貝
切片賦值操作是引用傳遞,兩個切片共享同一個底層數組。使用copy()函數可以將一個切片的數據復制到另一個切片:
func main() {
a := []int{1, 2, 3, 4, 5}
c := make([]int, 5)
copy(c, a)
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1 2 3 4 5]
}
切片遍歷
切片的遍歷方式與數組相同,支持索引遍歷和for range遍歷。
使用append()函數為切片添加元素
append()函數可以為切片動態添加元素:
func main() {
var s []int
s = append(s, 1) // [1]
s = append(s, 2, 3, 4) // [1 2 3 4]
s2 := []int{5, 6, 7}
s = append(s, s2...) // [1 2 3 4 5 6 7]
}
切片的擴容策略
切片的容量不足時,會按照一定的策略進行擴容。具體策略可以參考Go源碼中的實現。
從切片中刪除元素
Go語言中沒有專用方法刪除切片元素,可以使用切片的特性:
a = append(a[:index], a[index+1:]...)
結論
切片是Go語言中一個非常靈活和強大的數據結構,理解切片的底層實現和操作方式對于編寫高效的Go代碼非常重要。通過本文對切片的基本介紹和使用示例,相信讀者已經對Go語言中的切片有了一個較為全面的認識。

浙公網安備 33010602011771號