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

bsr*_*bsr 2 methods pointers go

这看起来很基础,但我无法轻松纠正以下程序 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()

}
Run Code Online (Sandbox Code Playgroud)
./prog.go:10:6: invalid receiver type B (B is a pointer type)
./prog.go:16:12: B(a) is not a type
Run Code Online (Sandbox Code Playgroud)

首先,我尝试将接收器更改为func (b *B) ,但没有成功。对于第二个,我尝试过&B{a},但这也不起作用。

A实际上是一个复杂的结构体,里面有互斥体(由 生成的结构体protobuf),所以我需要将它保留为指针,同时需要在其上定义额外的方法,因此定义一个新类型B

icz*_*cza 6

这是语言规范明确禁止的。规格:方法声明:

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

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