Go 官方 Slice 教程图解版

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 Ta = 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] = nila = 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...)

(0)

相关推荐