猿问

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

看起来很基础,但我不能轻易纠正下面的程序 https://play.golang.org/p/8IJn7g0m1As



import (

    "fmt"

)


type A struct{ value int }

type B *A


func (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。


神不在的星期二
浏览 168回答 2
2回答

qq_遁去的一_1

您需要将 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()}

MM们

这显然是语言规范所禁止的。规范:方法声明:接收者是通过方法名称前面的额外参数部分指定的。该参数部分必须声明一个非可变参数,即接收者。它的类型必须是已定义类型T或指向已定义类型的指针T。T称为接收器基类型。接收器基类型不能是指针或接口类型,它必须与方法定义在同一个包中。你不能声明一个接收器类型已经*T是T指针类型的方法,你也不能为其他包中定义的类型添加方法。类型声明和方法声明必须在同一个包中。
随时随地看视频慕课网APP

相关分类

Go
我要回答