转投go系列-指针类型属主和值类型属主

在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标准库中的类型被复制就不好使了,所以如果一个结构体类型内嵌了这些类型,则不应该用值类型。
  • 如果方法要修改当前结构的值,则必须用指针。

综上,没有特定需求,那么请使用指针类型作为属主。

上一篇:上机作业5 覃彬夏


下一篇:python中列表的反转与排序