來了!Go 官方 Slice 教程圖解版

較早使用 Go 的同學,應該有了解過 container/vector 包,不過後面引進了 append(),包裏的很多函數都可以使用 append() 和 copy() 代替,Go 官方就把這個包刪除了。

圖片

爲此,Go 官方還在 Github Wiki 上寫了一份文檔,關於如何使用 append() 和 copy() 代替 vector 包提供的方法,原文地址:

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

針對這份手冊,ueokande 做了一份圖解版的,看着生動形象,幫忙大家記憶,分享給大家。

想看原文的同學可以點擊文末的【閱讀原文】。

原文如下:

00.

圖片

1a = append(a, b...)
2
3

01.

圖片

 11.
 2b = make([]T, len(a))
 3copy(b, a)
 4
 52.
 6b = append([]T(nil), a...)
 7
 83.
 9b = append(a[:0:0], a...)
10
11

02.

圖片

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

03.

圖片

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

04.

圖片

11.
2a = append(a[:i], a[i+1:]...)
3
42.
5a = a[:i+copy(a[i:], a[i+1:])]
6
7

05.

圖片

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

06.

圖片

1a[i] = a[len(a)-1] 
2a = a[:len(a)-1]
3
4

07.

圖片

1a[i] = a[len(a)-1]
2a[len(a)-1] = nil
3a = a[:len(a)-1]
4
5

08.

圖片

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

09.

圖片

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

10.

圖片

 1n := 0
 2for _, x := range a {
 3 if keep(x) {
 4  a[n] = x
 5  n++
 6 }
 7}
 8a = a[:n]
 9
10

11.

圖片

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

12.

圖片

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

13.

圖片

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

14.

圖片

1a = append(a, x)
2
3

15.

圖片

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

16.

圖片

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

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GLEdRAOG24I38Zn9nh8F-Q