TonyBai · Go 语言进阶课
Tony Bai
资深架构师
514 人已学习
新⼈⾸单¥59
TonyBai · Go 语言进阶课
15
15
1.0x
00:00/00:00
登录|注册

03 | 值传递vs指针传递:深入Go数据操作的底层逻辑与性能考量

你好,我是 Tony Bai。
从这一节课开始,我们将进入 Go 语法细节。作为 Go 进阶者,你一定已经用过值类型(如 int、float64 以及自定义结构体类型)和指针类型(如 *int、*T)。你可能也知道什么时候用值、什么时候用指针,会对程序的性能和行为产生影响。
但你是否真正思考过:
当我们说“值”时,在计算机内存层面,它到底意味着什么?
Go 语言中“一切皆值”的理念,具体是如何体现的?
Go 的函数参数传递,到底是“值传递”还是“引用传递”?为什么传递指针和传递切片看起来效果不同?
在性能和程序正确性之间,我们该如何明智地选择使用值还是指针?
这些问题看似基础,却直击 Go 数据操作的本质。不深入理解值与指针的底层机制,你可能只是“知其然”,但在面对性能瓶颈、内存问题或复杂的共享状态时,会“不知其所以然”,难以写出真正高质量的 Go 代码。
这节课,我们就来彻底厘清这些概念,我们就将从计算机如何存储数据的底层原理出发,由浅入深、层层推进地讨论 Go 语言中的值类型、指针类型,以及它们在数据传递中的行为表现。同时也会介绍一些在使用值和指针时需要注意的事项。
掌握了这些,你对 Go 的数据操作将有更深刻的认识,为后续学习方法、接口、并发等打下坚实基础。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. Go语言中一切皆值,包括基本类型、复合类型和指针类型值,而对于map和channel变量,其本身存储的值是一个指针,指向了运行时在堆上分配的内部数据结构。 2. 值的可变性受到操作系统内存段限制和语言层面限制,如常量定义的值是不可变的,字符串类型的值在Go中也是不可变的,而大部分其他类型的值是可变的。 3. 在Go语言中,函数参数传递是值传递,但对于指针类型值,传递指针和传递切片会产生不同的效果,需要根据性能和程序正确性进行选择。 4. 传值还是传指针是需要根据对象的大小、可变性和是否支持复制等因素进行权衡,合理选择可以提高程序的性能和可读性。 5. 类型转换与内存解释中,使用unsafe包的操作非常危险,可能导致难以追踪的错误和程序崩溃,应该在绝对必要且完全理解其后果的情况下使用。 6. 深拷贝与浅拷贝的区别在于如何处理对象内部包含的指针(或引用)类型字段,深拷贝会递归地复制对象内部所有指针指向的数据,而浅拷贝只复制对象本身。 7. 值的比较需要根据不同类型的特性进行处理,对于浮点数类型、结构体和数组类型、切片类型、指针类型等都有不同的比较方式。 8. 零值机制保证了Go变量总是有个确定的初始状态,但对`nil`指针、`nil`map、`nil`slice等进行解引用或访问操作通常会导致运行时panic,使用前务必检查是否为`nil`. 9. 深入理解值与指针的底层机制对于写出高质量的Go代码至关重要,可以为后续学习方法、接口、并发等打下坚实基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《TonyBai · Go 语言进阶课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • Geek_2a62e6
    为什么有指针这个概念。结合我的理解,看是否有问题 是因为结构体/map等创建出来的对象很大不能直接放在栈区(栈区很小可能就几M),所以只能把数据放在堆区。所以在栈中创建一个指针类型的值,然后通过这个指针连接堆中数据。在访问数据时,如果存放的是基本数据类型直接返回,如果是堆地址那么就去堆空间查找返回堆数据。
    2025-05-16归属地:广东
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部