美文网首页
Go slice(切片)的几个坑

Go slice(切片)的几个坑

作者: firebook | 来源:发表于2020-02-29 22:26 被阅读0次

最近做的项目用的语言是Go,写代码的过程无可避免就要使用到slice,因为是从Java转过来的,对于我来说,slice就是Java的ArrayList。
晚上读《Go语言实战》,对照写代码过程碰到的问题,发现slice有一些隐蔽的坑,记录一下,权当备忘。

slice是当作动态数组来使用,底层用的是数组,内部实现有3个field:

  1. 指向数组第一个元素的指针
  2. 切片长度(已有元素长度)
  3. 切片容量(最多能够容纳多少元素)

第一个坑:子切片和父切片用的是同一个底层数组

看代码:

pSlice := []int{0, 10, 20, 30, 40}
//新建一个子切片,指定元素为pSlice的index 1到3(不包括3),即{10, 20}
subSlice := pSlice[1:3] 

这时候,改变subSlice的值,也会改动到pSlice

subSlice[1] = 22

pSlice索引为2的值也会变成22,这时候两个slice的值如下:
pSlice
{0, 10, 22, 30, 40}
subSlice
{10, 22}

如果对subSlice做append操作呢?
要知道,subSlice的长度是2,容量是4,append操作也会反映到pSlice

//append操作会返回一个新切片,同样共享底层数组
subSlice = append(subSlice, 33) 

这时候两个slice的值如下:
pSlice
{0, 10, 22, 33, 40}
subSlice
{10, 22, 33}

你以为改的只是一个切片,其实,你改了人家全家啊!

第二个坑:for range遍历的是副本

遍历切片当然是用for range,简洁大方

slice := []string{"wo", "shi", "shui"}
for index, value := range slice {
  println(&value)
  println(&slice[index])
}

地址根本不一样啊!
在range中改值,你以为改变了他,其实他从来没变过,你只是改变了它

相关文章

  • Go slice(切片)的几个坑

    最近做的项目用的语言是Go,写代码的过程无可避免就要使用到slice,因为是从Java转过来的,对于我来说,sli...

  • 深入理解 Go Slice

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

  • 【go笔记】切片(slice)结构的简介

    我们java里有个ArrayList, 那go有切片(slice)。看起来有点像,但是了解切片(slice)结构后...

  • Go 切片(slice)

    Go中,数组的长度是不可变的,但是Go提供了一种灵活的内置类型:切片(也称为动态数组)。 切片的长度不固定,可以追...

  • 七、Go切片

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

  • go 语言切片

    go 语言切片 简单切片 slice 是 对 array 的一个 view 创建简单切片 切片作为函数参数 对切...

  • 七.Go切片slice

    切片slice 本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可关联底层数组的局部或全部 数据类型为引...

  • Go语言切片(Slice)

    Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,...

  • Go之Slice(切片)

    内部结构 切片表面上用起来像是一个可变数组,但它其实是一个结构体,内部结构如下: 切片分为三个参数 指针,指向一片...

  • Golang之数组和切片

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

网友评论

      本文标题:Go slice(切片)的几个坑

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