首页 > 其他分享 >Go 语言为什么建议 append 追加新元素使用原切片变量接收返回值?

Go 语言为什么建议 append 追加新元素使用原切片变量接收返回值?

时间:2022-09-26 10:00:51浏览次数:78  
标签:len 切片 追加 Go 返回值 新元素 append

看一段代码

func main() {
	a := make([]int, 0, 5)
	fmt.Printf("%v:%p, len(a) = %d\n", a, &a, len(a))
	a = append(a, 1)
	fmt.Printf("%v:%p, len(a) = %d\n", a, &a, len(a))
	b := append(a, 2)
	fmt.Printf("%v:%p, len(b) = %d\n", b, &b, len(b))
	c := append(a, 3)
	fmt.Printf("%v:%p, len(b) = %d\n", b, &b, len(b))
	fmt.Printf("%v:%p, len(c) = %d\n", c, &c, len(c))
}

输出结果:

[]:0xc000096060, len(a) = 0
[1]:0xc000096060, len(a) = 1  
[1 2]:0xc0000960a8, len(b) = 2
[1 3]:0xc0000960a8, len(b) = 2
[1 3]:0xc0000960d8, len(c) = 2

阅读上面这段代码,我们定义一个长度为 0,容量为 5 的 int 类型的切片 a。

首先,我们使用 Go 语言内置函数 append 追加一个元素 1 到切片 a 中。

然后,我们使用 Go 语言内置函数 append 追加一个元素 2 到切片 a 中。

最后,我们使用 Go 语言内置函数 append 追加一个元素 3 到切片 a 中。

但是,我们在输出结果中发现,b 的输出结果不是 [1 2],c 的输出结果不是 [1 2 3],b 和 c 的实际输出结果相同,都是 [1 3]。为什么呢?

因为 Go 语言内置函数 append 参数是值传递,所以 append 函数在追加新元素到切片时,append 会生成一个新切片,并且将原切片的值拷贝到新切片。

在 Part 02 示例代码中,我们三次使用 append 参数追加新元素到切片 a 的操作,接收返回值的变量都不同。

第二次操作时,因为 append 生成一个新切片,将原切片 a 的值拷贝到新切片,并且将新元素在原切片a[len(a)] 长度的位置开始追加,使用变量 b 接收 append 返回值 [1 2],所以变量 b 的值是 [1 2]。

第三次操作时,同样 append 生成一个新切片,将原切片 a 的值拷贝到新切片,并且将新元素在原切片a[len(a)] 长度的位置开始追加,使用变量 c 接收 append 返回值 [1 3],所以变量 c 的值是 [1 3]。

但是,因为三个切片的底层数组相同,Go 内置函数 append 会在原切片长度的位置开始追加新元素,所以第三次操作时,把第二次操作时得到的变量 b 的最后一个元素覆盖了。

阅读到这里,相信聪明的读者朋友们已经明白 Part 02 示例代码为什么实际输出结果和预想的输出结果不同了吧。

参考文档

标签:len,切片,追加,Go,返回值,新元素,append
From: https://www.cnblogs.com/mayanan/p/16729885.html

相关文章

  • Flask or Django?
    首先对于刚接触Python后端的新手先学哪一个?哪一个都可以!不要停留在原地,一旦决定了就一直坚持走下去!Flask容易入门,基本上在搭好开发环境的前提下花几个小时学习就可以算......
  • golang面试题3
    go基础1、redis部署多节点模式,异步队列2、go-redis和redis-go//go-redis的连接模式,直连哨兵3、go异常处理,异常捕获方式,go里面替代try-catch如何操作4、gomaxprocs的默认......
  • go的类型转换cast
    在使用Go编码过程中,大家一定遇到过类型转换的场景。今天就给大家介绍一个简单、易用且安全的类型转换工具:cast。以下是cast的基本档案:cast包档案star2.5kused......
  • 密码学奇妙之旅、01 CFB密文反馈模式、AES标准、Golang代码
    CFB密文反馈模式CFB密文反馈模式属于分组密码模式中的一种。加密与解密使用同一结构,加密步骤生成用于异或的密钥流。其弥补了ECB电子密码本模式的不足(明文中的重复排列会......
  • golang中下划线的作用
    1.忽略返回值2判断一个类是否实现了某个接口//定义了一个animal接口1typeAnimalinterface{Say()}//定义了一个dog结构体typeDogstruct{}//用来判断Do......
  • ubuntu安装go
    1.下载go的安装包wget-chttps://studygolang.com/dl/golang/go1.19.1.linux-arm64.tar.gz-O-|sudotar-xz-C/usr/local注意!!!下载的版本一定要和你的linux系统配......
  • go 稀疏数组
     稀疏数组实现:packagemainimport"fmt"typeSparseArraystruct{ colint rowint valueint}funcmain(){ //源数据格式: /* 000......
  • 【mongo 系列】聚合知识点梳理
    什么是聚合数据?我们先来看看是是聚合数据数据聚合(DataAggregation)是指合并来自不同数据源的数据。.聚类也称聚类分析,亦称为群集分析,是对于统计数据分析的一门技术,在......
  • Django项目在现有的数据表中新增字段
    models.py文件1classUserInfo(AbstractUser):2phone=models.CharField(max_length=11)3addr=models.CharField(max_length=128)4avatar=model......
  • 【golang】json数据解析 - 嵌套json解析
    @目录1.通过结构体映射解析2.嵌套json解析-map1.通过结构体映射解析原数据结构解析//结构体typecontractJsonstruct{ Data[]transaction`json:"data"` T......