四时宝库

程序员的知识宝库

掌握GO中的Slice,这就够了(go slam)

最近Golang越来越火,不少小伙伴都纷纷开始学习Golang,但对于原先为C++或者JAVA的同学,用习惯了数据、list、vector等,会对Go的切片slice不习惯,下面整理出go中slice的常见用法,建议收藏以备不时之需。

追加插入

x := []int{1, 2, 3}
y := []int{4, 5, 6}
x = append(x, y...)

复制1

x := []int{1, 2, 3}
y := make([]int, len(x))
copy(y, x)

复制2

x := []int{1, 2, 3}
y := append([]int(nil), x...)

复制3

x := []int{1, 2, 3}
y := append(x[:0:0], x...)

删除部分

//切掉第三第四位
x := []int{1, 2, 3, 7, 8}
x = append(x[:2], x[4:]...)

删除某一位

x := []int{1, 2, 3, 7, 8}
x = append(x[:i], x[i+1:]...)

插入

a = append(a[:i], append([]T{x}, a[i:]...)...)
//上述方法在第二个append的时候会生成一个新的slice变量,为了减少内存使用与垃圾回收,我们可以采用下面的方法
s = append(s, 0 这里0表示这个类型的初始状态 )
copy(s[i+1:], s[i:])
s[i] = x

在C++或者JAVA中,栈都是我们常用的数据结构,那么在go中怎么实现一个栈的功能呢?

插入push

a = append(a, x)

弹出pop

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

队列是我们常用的数据结构之一,我们该如何实现一个队列呢?队列的特点是尾进头出,插入我们可以类似上面的栈的插入,头部弹出如下

弹出

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

过滤功能也是我们常用的,我们如何使用Go过滤slice中满足条件的元素呢?

过滤

b := a[:0]
for _, x := range a {
 if f(x) {
 b = append(b, x)
 }
}

反转

for i := len(a)/2-1; i >= 0; i-- {
 opp := len(a)-1-i
 a[i], a[opp] = a[opp], a[i]
}

如果你想学习go,不管你是新手还是从C++/JAVA中转过来的,有什么疑问可以留言,大家一起讨论互相学习。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接