作为一个java转型go语言的程序员,以前用java时,直接将对象作为参数传递就可以了。而在go语言项目中,由于其保留了一些指针的特性,有时则推荐传递对象的指针,否则将因为拷贝新对象而造成额外的开销。
这里为自己整理一下需要使用指针类型或需要值类型作为参数传递的场景。
需要指针类型传递
- 修改原对象:当需要修改传入的结构体或对象的内容时,应该使用指针传参。
- 传递大对象:对于占用内存较大的结构体,使用指针可以减少内存拷贝,提高性能。
- 在 map 中使用:当需要在 map 中存储结构体时,建议使用结构体的地址作为值。
- 需要 nil 表示空值或状态:指针可以为 nil,因此可以用来表示无值或尚未初始化的状态,这在某些逻辑中非常有用。
需要值类型传递
- 小对象:对于小型的、轻量级的结构体或基本类型(如 int, float64, string 等),如果没有特殊的性能需求或需要修改原对象的情况,通常使用值传递更加简洁且效率高。Go 会为这些小对象做优化,不会造成额外的开销。
- 避免修改原始对象:如果函数不需要修改原始对象的内容,使用值传递更加简单明了。这样可以避免不小心修改原始数据的错误。
- 传递常量值:常量值(如常量字符串、数字等)本身不会发生变化,所以可以直接通过值传递,而不需要使用指针。
- 切片、映射和通道等内建类型:对于 Go 内建类型如切片(slice)、映射(map)、通道(channel)等,它们本身就是引用类型,传递时已经是传递引用而不是拷贝。因此,不需要额外使用指针。