添加元素

方法:append(slice,elems...)

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
func main() {

// 未触发扩容
arr := []int{0,1,2,3,4,5,6,7,8,9}
s := arr[0:2]
news := append(s, 100)
fmt.Printf("news ptr : %p\ts ptr : %p\n",news,s)
fmt.Println("s\t",s)
fmt.Println("news\t",news)
fmt.Println("arr\t",arr)
fmt.Println("====================")
// 触发扩容
arr = []int{0,1,2}
s = arr[:]
news = append(s,100)
fmt.Printf("news ptr : %p\ts ptr : %p\n",news,s)
fmt.Println("s\t",s)
fmt.Println("news\t",news)
fmt.Println("arr\t",arr)
}

测试结果:

1
2
3
4
5
6
7
8
9
news ptr : 0xc00007a0a0	s ptr : 0xc00007a0a0
s [0 1]
news [0 1 100]
arr [0 1 100 3 4 5 6 7 8 9]
====================
news ptr : 0xc000072030 s ptr : 0xc00004a0e0
s [0 1 2]
news [0 1 2 100]
arr [0 1 2]

结论:

  1. append方法会创建一个新slice,原slice不变。
  2. 调用append方法如果未触发扩容,则底层array对应位置会做出相应改变
  3. 调用append方法如果触发扩容,则原底层array对应位置不发生变化,因为新的slice底层array也已变化

复制元素

方法:copy(dst []type,src []type)

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"
func main() {

s1 := make([]int,1)
s2 := []int{1,2,3}

// len(src) > len(dst)
fmt.Println("before\tdst :",s1,"src :",s2)
copy(s1,s2)
fmt.Println("after\tdst :",s1,"src :",s2)
fmt.Println("=====================")

// len(src) < len(dst)
s1 = make([]int,1)
fmt.Println("before\tdst :",s2,"src :",s1)
copy(s2,s1)
fmt.Println("after\tdst :",s2,"src :",s1)
}

测试结果:

1
2
3
4
5
before	dst : [0] src : [1 2 3]
after dst : [1] src : [1 2 3]
=====================
before dst : [1 2 3] src : [0]
after dst : [0 2 3] src : [0]

结论:

  1. src数据拷贝到dst
  2. 如果src长度大于dst长度,则只会复制len(dst)个数据到dst
  3. 如果src长度小于dst长度,则dst的前len(src)个数据会被src的数据覆盖,后边不变

删除操作

无默认删除操作,可通过append实现

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

func main() {

s1 := []int{0,1,2,3,4,5}
fmt.Printf("before del s1's ptr :\t%p\n",s1)
fmt.Println(s1)
fmt.Println("=============")
// do delete
s1 = append(s1[:2],s1[3:]...)
fmt.Printf("after del s1's ptr :\t%p\n",s1)
fmt.Println(s1)
}

测试结果:

1
2
3
4
5
before del s1's ptr :	0xc000072030
[0 1 2 3 4 5]
=============
after del s1's ptr : 0xc000072030
[0 1 3 4 5]

结论:

  1. 删除元素slice长度只会减小不会增大,因此底层数组不会发生变化。

修改

方法:无方法,直接通过 slice[i] = val 修改

测试:

遍历

方法: for i,v := range slice遍历

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import "fmt"

func main() {

s := []int{0, 2, 4, 6, 8, 10}
// 只用 index
for i := range s {
fmt.Printf("%d,", i)
}
fmt.Println()
// index,value都用
for i, v := range s {
fmt.Printf("%d:%d,\t", i, v)
}
fmt.Println()
// 只用value
for _, v := range s {
fmt.Printf("%d,", v)
}
fmt.Println()
}

输出

1
2
3
0,1,2,3,4,5,
0:0, 1:2, 2:4, 3:6, 4:8, 5:10,
0,2,4,6,8,10,