首页 文章详情

Go 官方 Slice 教程图解版

Go语言精选 | 460 2021-02-02 09:37 0 0 0
UniSMS (合一短信)

via:

https://ueokande.github.io/go-slice-tricks/
作者:ueokande

较早使用 Go 的同学,应该有了解过 container/vector 包,不过后面引进了 append(),包里的很多函数都可以使用 append() 和 copy() 代替,Go 官方就把这个包删除了。

为此,Go 官方还在 Github Wiki 上写了一份文档,关于如何使用 append() 和 copy() 代替 vector 包提供的方法,原文地址:

https://github.com/golang/go/wiki/SliceTricks

针对这份手册,ueokande 做了一份图解版的,看着生动形象,帮忙大家记忆,分享给大家。

想看原文的同学可以点击文末的【阅读原文】。


原文如下:


00. 

a = append(a, b...)

01. 

1.
b = make([]T, len(a))
copy(b, a)

2.
b = append([]T(nil), a...)

3.
b = append(a[:0:0], a...)

02. 

a = append(a[:i], a[j:]...)

03. 

copy(a[i:], a[j:])
for k, n := len(a)-j+i, len(a); k < n; k++ {
 a[k] = nil // or the zero value of T
}
a = a[:len(a)-j+i]

04. 

1.
a = append(a[:i], a[i+1:]...)

2.
a = a[:i+copy(a[i:], a[i+1:])]

05. 

if i < len(a)-1 {
  copy(a[i:], a[i+1:])
}
a[len(a)-1] = nil // or the zero value of T
a = a[:len(a)-1]

06. 

a[i] = a[len(a)-1
a = a[:len(a)-1]

07. 

a[i] = a[len(a)-1]
a[len(a)-1] = nil
a = a[:len(a)-1]

08. 


a = append(a[:i], append(make([]T, j), a[i:]...)...)

09. 

a = append(a, make([]T, j)...)

10. 

n := 0
for _, x := range a {
 if keep(x) {
  a[n] = x
  n++
 }
}
a = a[:n]

11. 

a = append(a[:i], append([]T{x}, a[i:]...)...)

12. 

a = append(a[:i], append(b, a[i:]...)...)

13. 

x, a = a[len(a)-1], a[:len(a)-1]

14. 

a = append(a, x)

15. 

x, a = a[0], a[1:]

16. 

a = append([]T{x}, a...)




推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter