- 引用类型
- 零值nil
- 字面量
- 构造/初始化 make()
- 追加 append()
- 复制 copy()
- 遍历 for…range…
- 长度 len()
- 容量 cap()
- 判等 == nil
例子
package main
import "fmt"
func main() {
//零值
var s0 []int //s0: nil
//字面量
var s1 = []int{0, 1, 2} //s1: [0,1,2]
//make()
var s2 = make([]int, 2) //s2: [0,0],len = 2
var s3 = make([]int, 2, 4) //s3: [0,0],len = 2,cap = 4
//append()
s0 = append(s0, 0) // s0: [0]
s1 = append(s1, 3, 4) //s1: [0,1,2,3,4]
s2 = append(s2, s1[2:4]...) //s2: [0,0,2,3], ... 解包操作
//copy()
length := copy(s3[0:], s1[1:]) //s3: [1,2],s1[1:]: [1,2,3,4]. length: 2
fmt.Println(len(s3), len(s1[1:]), length)
//for...range...
for k := range s3 { //k 是索引
fmt.Printf("s3[%v] = %v\n", k, s3[k]) //顺序遍历 s3[0] = 1, s3[1] = 2
}
for k, v := range s3 { //k 是索引,v 是值
if k == 1 {
s3[k] = v + 1 //📗这里的 s3 是原 s3 的副本,是引用类型,它们指向同样的底层数组,原s3的内容被改变
}
}
fmt.Println(s3) //📗原s3的内容被改变
//len() cap()
fmt.Println(len(s3), cap(s3)) //长度2,容量4
//nil == , 只能和 nil 判等
fmt.Println(s0 == nil) //false
//s0 == s0 //❌编译报错 slice can only be compared to nil
fmt.Println(s0, s1, s2, s3)
}
输出
2 4 2
s3[0] = 1
s3[1] = 2
[1 3]
2 4
false
[0] [0 1 2 3 4] [0 0 2 3] [1 3]