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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值