8 切片的赋值拷贝下面的代码中演示了拷贝前后两个变量共享底层数组,对一个切片的修改会影响另一个切片的内容,这点需要特别注意。 8.1 一般赋值func main() {
s1 := make([]int, 3)
s2 := s1
s2[0] = 100
fmt.Println(s1)
fmt.Println(s2)
}
复制
1 2 3 4 5 6 7
8.2 使用copy()函数复制切片func main() {
a := []int{1, 2, 3, 4, 5}
b := a
fmt.Println(a)
fmt.Println(b)
b[0] = 1000
fmt.Println(a)
fmt.Println(b)
}
复制
1 2 3 4 5 6 7 8 9
由于切片是引用类型,所以a和b其实都指向了同一块内存地址.修改b的同时a的值也会变化. Go语言内建的copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中,copy()函数的使用格式如下:
格式如下 copy(destSlice, srcSlice []T) - srcSlice: 数据来源切片
- destSlice: 目标切片
func main() {
a := []int{1, 2, 3, 4, 5}
c := make([]int, 5, 5)
copy(c, a)
fmt.Println(a)
fmt.Println(c)
c[0] = 1000
fmt.Println(a)
fmt.Println(c)
}
复制
1 2 3 4 5 6 7 8 9 10 11
9 切片遍历切片的遍历方式和数组是一致的,支持索引遍历和for range遍历类似于java的增强foreach。 func main() {
s := []int{1, 3, 5}
for i := 0; i < len(s); i++ {
fmt.Println(i, s[i])
}
for index, value := range s {
fmt.Println(index, value)
}
}
复制
1 2 3 4 5 6 7 8 9 10 11
10 append()方法为切片添加元素Go语言的内建函数append() 可以为切片动态添加元素。 每个切片会指向一个底层数组,这个数组能容纳一定数量的元素。当底层数组不能容纳新增的元素时,切片就会自动按照一定的策略进行“扩容”,此时该切片指向的底层数组就会更换。“扩容”操作往往发生在append() 函数调用时。 举个例子
func main() {
var numSlice []int
for i := 0; i < 10; i++ {
numSlice = append(numSlice, i)
fmt.Printf("%v len:%d cap:%d ptr:%p\n", numSlice, len(numSlice), cap(numSlice), numSlice)
}
}
复制
1 2 3 4 5 6 7 8
输出[0] len:1 cap:1 ptr:0xc0000a8000
[0 1] len:2 cap:2 ptr:0xc0000a8040
[0 1 2] len:3 cap:4 ptr:0xc0000b2020
[0 1 2 3] len:4 cap:4 ptr:0xc0000b2020
[0 1 2 3 4] len:5 cap:8 ptr:0xc0000b6000
[0 1 2 3 4 5] len:6 cap:8 ptr:0xc0000b6000
[0 1 2 3 4 5 6] len:7 cap:8 ptr:0xc0000b6000
[0 1 2 3 4 5 6 7] len:8 cap:8 ptr:0xc0000b6000
[0 1 2 3 4 5 6 7 8] len:9 cap:16 ptr:0xc0000b8000
[0 1 2 3 4 5 6 7 8 9] len:10 cap:16 ptr:0xc0000b8000
复制
1 2 3 4 5 6 7 8 9 10
一次性追加多个元素var citySlice []string
citySlice = append(citySlice, "北京")
citySlice = append(citySlice, "上海", "广州", "深圳")
a := []string{"成都", "重庆"}
citySlice
|