在go语言中,值类型和指针类型的核心区别在于数据的存储位置和传递方式,这直接影响内存分配行为和函数调用时的性能与语义。
值类型:直接存储数据,传递时复制
值类型变量直接包含其数据,常见的值类型包括int、Float、bool、Struct、Array等。当变量是值类型时,每次赋值或传参都会创建一份完整的副本。
说明:
示例:
立即学习“go语言免费学习笔记(深入)”;
func modifyValue(v int) { v = 100 } // 不会影响外部变量
指针类型:存储地址,传递时共享数据
指针类型变量保存的是另一个变量的内存地址。通过&取地址,*解引用访问目标值。常见于*int、*struct等类型。
说明:
示例:
立即学习“go语言免费学习笔记(深入)”;
func modifyPointer(p *int) { *p = 100 } // 修改原始变量
内存分配对比:栈 vs 堆
值类型不一定只在栈上分配,编译器会根据逃逸分析决定是否分配到堆。但通常:
- 局部值类型变量:分配在栈上,函数返回后自动回收。
- 被指针引用或返回的变量:可能逃逸到堆,由GC管理。
- 使用指针会增加堆分配概率,但也减少了复制开销。
结构体传递的选择建议
对于结构体类型,选择值还是指针传递需权衡:
- 小结构体(如仅几个字段):用值类型,避免指针开销。
- 大结构体或需修改内容:用指针类型,避免复制性能损耗。
- 实现接口时:若方法集包含指针接收者,应使用指针变量。
基本上就这些。理解值和指针的传递机制,有助于写出高效且语义清晰的Go代码。
以上就是golang值类型和指针类型
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐