为了账号安全,请及时绑定邮箱和手机立即绑定

指针(别名)类型的无效接收器

指针(别名)类型的无效接收器

Go
神不在的星期二 2022-07-25 10:35:57
看起来很基础,但我不能轻易纠正下面的程序 https://play.golang.org/p/8IJn7g0m1Asimport (    "fmt")type A struct{ value int }type B *Afunc (b B) Print() {    fmt.Printf("Value: %d\n", b.value)}func main() {    a := &A{1}    b := new(B(a))    b.Print()}./prog.go:10:6: invalid receiver type B (B is a pointer type)./prog.go:16:12: B(a) is not a type首先,我尝试将接收器更改为func (b *B) ,但没有成功。对于第二个,我尝试了 like &B{a},但也没有用。A实际上是一个复杂的结构体,里面有互斥体(由 生成的结构体protobuf),所以我需要把它保存为指针,同时需要在上面定义额外的方法,所以定义一个新的类型B。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超8个赞

您需要将 A 嵌入到 B 的结构中。您不能使用指针声明新类型。


type A struct{ value int }


type B struct{

    *A

}


func (b B) Print() {

    fmt.Printf("Value: %d\n", b.value)

}


func main() {

    a := &A{1}

    b := B{a}

    b.Print()

}


查看完整回答
反对 回复 2022-07-25
?
MM们

TA贡献1886条经验 获得超2个赞

这显然是语言规范所禁止的。规范:方法声明:

接收者是通过方法名称前面的额外参数部分指定的。该参数部分必须声明一个非可变参数,即接收者。它的类型必须是已定义类型T或指向已定义类型的指针TT称为接收器基类型接收器基类型不能是指针或接口类型,它必须与方法定义在同一个包中。

你不能声明一个接收器类型已经*TT指针类型的方法,你也不能为其他包中定义的类型添加方法。类型声明和方法声明必须在同一个包中。


查看完整回答
反对 回复 2022-07-25
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号