专栏名称: HULK一线技术杂谈
HULK是360的私有云平台,丰富的一线实战经验,为你带来最有料的技术分享
目录
相关文章推荐
51好读  ›  专栏  ›  HULK一线技术杂谈

Go编程基础

HULK一线技术杂谈  · 公众号  ·  · 2018-11-01 18:27

正文

请到「今天看啥」查看全文


对应的数据结构为:

之后,我们再调用:

ss := s[2:4]

我们得到:

所以两个slice,相当于是在底层array上的两个切片。大家请注意下第二个slice的cap是3。

使用注意

slice在使用中有几个很容易出错的地方,需要大家注意下。


这里先总结下最容易出错的原因,就是多个slice在使用同样的底层存储时,修改一个slice会导致其它slice中的数据变化。


示例1:

s := []int{1, 2, 3}

fmt.Println(s)


ss := s[1:3]

ss[0] = 0

fmt.Println(s, ss)


s[1] = 11

fmt.Println(s, ss)


输出

[1 2 3]

[1 0 3] [0 3]

[1 11 3] [11 3]


大家可以看到,由于两个slice都是用同样的底层array,所以修改其中一个就会导致另外一个的变化。


示例2:

func main() {

s := []int{1, 2, 3}

fmt.Println(s)


foo(s) or foo(s[1:3])

fmt.Println(s)

}


func foo(ss []int) {

ss[0] = 0

}


输出:

[1 2 3]

[1 0 3]


这个和上面同样的原因


示例3:

s := []int{1, 2, 3}

fmt.Println(s)


ss := s[1:3]

ss = append(ss, 4)

fmt.Println(s, ss)


输出:

[1 2 3]

[1 2 3] [2 3 4]

这里大家可以看到,由于append操作改变了其中一个slice的底层array,所以对其中一个slice的修改不会影响到另外一个。







请到「今天看啥」查看全文