图解 Slice 操作

点击上方蓝色“Golang来啦”关注我哟

加个“星标”,天天 15 分钟,掌握 Go 语言

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...)

这是持续翻译的第 17/100 篇优质文章。
如果你有想交流的话题,欢迎留言。


推荐阅读:

非懂不可的Slice(一)

非懂不可的Slice(二)

Go slice 全面指南

如果我的文章对你有所帮助,点赞、转发都是一种支持!

给个[在看],是对四哥最大的支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seekload

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值