在Go中,我们可以为struct声明一个方法,那么定义方法的时候到底加不加星号呢?
package main
import "fmt"
type B struct {
bb int
}
func (b B) BB() int {
return b.bb
}
func (b *B) BB2() int {
return (*b).BB()
}
func main() {
b := B{bb: 123}
p := &b
f1 := b.BB
f2 := p.BB
g1 := p.BB2
g2 := b.BB2
b.bb = 789
fmt.Println(f1()) // 123
fmt.Println(f2()) // 123
fmt.Println(g1()) // 789
fmt.Println(g2()) // 789
}
答案:统一都用*就完事了,确实太多的指针可能会增加垃圾回收器的负担,但跟下面这些缺点比,可以接受:
- 如果一个值类型的尺寸太大,那么参数在传参的时候的复制成本将不可忽略。
- 同时在并发场合下,调用值类型和指针类型方法比较易于产生数据竞争
- sync标准库中的类型被复制就不好使了,所以如果一个结构体类型内嵌了这些类型,则不应该用值类型。
- 如果方法要修改当前结构的值,则必须用指针。
综上,没有特定需求,那么请使用指针类型作为属主。