美文网首页
[GO]关于go中slice的一些实践

[GO]关于go中slice的一些实践

作者: 卅云川 | 来源:发表于2019-11-12 14:12 被阅读0次

由Insert引出的slice底层存储问题

其实这个只是在搜索对go中的slice进行插入时,一行代码引起的小实验。
结论:对slice的修改是直接体现于底层内存中的

现在想尝试对数组指定位插入一个值。所以先声明数组:

arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

现在尝试对下标第 2 位插入-1,在网上看到一种方式如下(为了方便,对每一步操作的数组进行打印输出):

tmp := append([]int{}, arr[2:]...)
fmt.Printf("tmp: %v\n", tmp)

arr = append(arr[0:2], -1)
fmt.Printf("arr: %v\n", arr)
fmt.Printf("tmp: %v\n", tmp)

arr = append(arr, tmp...)
fmt.Printf("arr: %v\n", arr)

按照上述代码确实可以达成我们的目的,最终添加的输出代码打印结果如下:

tmp: [3 4 5 6 7 8 9 0]
arr: [1 2 -1]
tmp: [3 4 5 6 7 8 9 0]
arr: [1 2 -1 3 4 5 6 7 8 9 0]

所以问题来了,是否可以将代码中对 tmp 的赋值,由 append 这种拷贝一个新数组的方式,改为直接引用原 slice 呢?

为了解答这个问题,继续试验,修改原代码如下:

tmp := arr[2:] // append([]int{}, arr[2:]...)
fmt.Printf("tmp: %v\n", tmp)

arr = append(arr[0:2], -1)
fmt.Printf("arr: %v\n", arr)
fmt.Printf("tmp: %v\n", tmp)

arr = append(arr, tmp...)
fmt.Printf("arr: %v\n", arr)

这次的输出就可以说明问题了:

tmp: [3 4 5 6 7 8 9 0]
arr: [1 2 -1]
tmp: [-1 4 5 6 7 8 9 0]
arr: [1 2 -1 -1 4 5 6 7 8 9 0]

由于 tmp 直接引用的是 arr ,所以当 arr 的第 2 位修改之后,tmp 的第 0 位也随即发生更改,所以才会出现最后的这个结果。

所以实践表明,对于 slice 内容的修改,也可能会使其他直接引用了的 slice 内容发生变化,毕竟他们使用的是同一块内存。所以最稳妥的办法自然是拷贝一份新的再添加回来了。

相关文章

  • [GO]关于go中slice的一些实践

    由Insert引出的slice底层存储问题 其实这个只是在搜索对go中的slice进行插入时,一行代码引起的小实验...

  • Go slice那些事

    今晚闲来无事,总结一下Go的slice slice是什么slice在Go中的原型?slice类似数组,是一种定长的...

  • 深入理解 Go Slice

    原文地址:深入理解 Go Slice 是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特...

  • Go语言——Slice分析

    Go语言——Slice分析 源码很不好找,在go\src\runtime\slice.go。 根据容量cap*元素...

  • Go slice扩容深度分析(来自掘金文章)

    Go slice扩容深度分析 本文主要是对go slice的扩容机制进行了一些分析。环境,64位centos的do...

  • Go Slice 最大容量大小是怎么来的

    原文地址:Go Slice 最大容量大小是怎么来的 前言 在《深入理解 Go Slice》中,我们提到了 “根据其...

  • go和python的深浅拷贝理解

    go深拷贝, 就是拷贝值 go浅拷贝, 拷贝引用 go中赋值就能实现拷贝,针对引用类型(slice,map,cha...

  • Go 分组 & 排序

    其中,排序的代码是 go sdk 提供的 go1.16.4/src/sort/slice.go :

  • Golang之数组和切片

    引用 数组、字符串和切片 Go数组中的索引问题 深入解析 Go 中 Slice 底层实现 Golang 入门 : ...

  • 七、Go切片

    七、Go语言切片(Slice) Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就...

网友评论

      本文标题:[GO]关于go中slice的一些实践

      本文链接:https://www.haomeiwen.com/subject/ostqictx.html