理解 Go 中的切片:append 操作的深入分析(篇2)

这篇具有很好参考价值的文章主要介绍了理解 Go 中的切片:append 操作的深入分析(篇2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理解 Go 语言中 slice 的性质对于编程非常有益。下面,我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。

本篇为第 2 篇,当切片的容量 cap 不够时

func main() {
	// slice1 当前长度为 3,容量大小也为 3
	slice1 := make([]int, 3, 3)
	fmt.Println("slice 1:", slice1, len(slice1), cap(slice1))

	test1(slice1)

	fmt.Println("slice 1:", slice1, len(slice1), cap(slice1))
}

func test1(slice2 []int) {
	slice2[0] = 1
	slice2 = append(slice2, 1)	// append 操作
	slice2[0] = 2
	fmt.Println("slice 2:", slice2, len(slice2), cap(slice2))
}

输出:

slice 1[0 0 0] 3 3
slice 2[2 0 0 1] 4 6
slice 1[1 0 0] 3 3

解释:在 test1 函数中,我们首先将 slice2 的第一个元素设为 1(这个更改也反映在 slice1 上),然后对其执行 append 操作。

因为 slice2 的容量已满(3/3),所以 append 操作会触发底层数组的扩容。
当新的底层数组准备好之后,我们再次更改 slice2 的第一个元素,将其设为 2。这次的更改并不影响 slice1,因为扩容操作已使 slice2 指向新的底层数组。

示意图如下:

理解 Go 中的切片:append 操作的深入分析(篇2),go,golang,开发语言,后端文章来源地址https://www.toymoban.com/news/detail-649665.html

到了这里,关于理解 Go 中的切片:append 操作的深入分析(篇2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(42)
  • GO学习之切片操作

    1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 12、GO学习

    2024年02月16日
    浏览(29)
  • go中的切片

    案例1: 从输出结果可以看出:append 后的 s 被重新分配了底层数组(也就是说 s 的底层数组不再是 data,那么修改 s 的值不会再影响 data,它们不再有关联),并把原数组中的值拷贝到新数组中。这是因为超出了原切片的容量。在上例中,如果只追加一个值,则不会超过 s.ca

    2024年02月10日
    浏览(35)
  • go语言中的切片

    切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含 地址 、 长度 和 容量 。切片一般用于快速地操作一块数据集合。 切片的本质就是对底层数组的封装,它包含了

    2024年02月11日
    浏览(38)
  • Go语言中的数组、切片和映射解析

    数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。 例如声明一个整形数组: 在类型名前加 [] 中括号,并设置好长度,大括号中的元素用于初始化数组,需要注意的是数组的长度不同,即属于不同的类型。 如果所有元素都被初始化的数组,声明时可以

    2024年02月09日
    浏览(42)
  • golang 中 go func() {} 理解

    在Golang 中,go func() {} 表示创建一个新的 Goroutine(轻量级线程),用于异步执行函数。 具体来说,go func() {} 创建了一个匿名函数(即没有函数名的函数),并在其前面加上 go,以表示该函数应该在一个新的 Goroutine 中异步执行。因此,当程序执行到该语句时,它会立即

    2024年02月15日
    浏览(36)
  • 【Golang星辰图】Go语言云计算SDK全攻略:深入Go云存储SDK实践

    在当今数字化时代,云计算和存储服务扮演着至关重要的角色,为应用程序提供高效、可靠的基础设施支持。本文将介绍几种流行的Go语言SDK,帮助开发者与AWS、Google Cloud、Azure、MinIO、 阿里云和腾讯云等各大云服务提供商的平台进行交互。 欢迎订阅专栏:Golang星辰图 1.1 提供

    2024年03月17日
    浏览(45)
  • 深入理解Go语言接口

    接口是一种定义了软件组件之间交互规范的重要概念,其促进了代码的解耦、模块化和可扩展性,提供了多态性和抽象的能力,简化了依赖管理和替换,方便进行单元测试和集成测试。这些特性使得接口成为构建可靠、可维护和可扩展的软件系统的关键工具之一。 在现代编程

    2024年02月09日
    浏览(44)
  • 深入理解 go chan

    go 里面,在实际程序运行的过程中,往往会有很多协程在执行,通过启动多个协程的方式,我们可以更高效地利用系统资源。 而不同协程之间往往需要进行通信,不同于以往多线程程序的那种通信方式,在 go 里面是通过 channel (也就是 chan 类型)来进行通信的, 实现的方式

    2024年02月01日
    浏览(34)
  • 深入理解 go sync.Waitgroup

    本文基于 Go 1.19。 go 里面的 WaitGroup 是非常常见的一种并发控制方式,它可以让我们的代码等待一组 goroutine 的结束。 比如在主协程中等待几个子协程去做一些耗时的操作,如发起几个 HTTP 请求,然后等待它们的结果。 下面的代码展示了一个 goroutine 等待另外 2 个 goroutine 结束

    2024年01月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包