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

Go 指针(别名)类型的接收器无效,go,pointers,methods,Go,Pointers,Methods,这似乎很基本,但我不能轻易地纠正下面的程序 第一次,我尝试将接收器更改为func(b*b),但没有成功。 对于第二种情况,我尝试了&B{a},但也没有成功 A实际上是一个包含互斥体的复杂结构(由protobuf生成的结构),因此我需要将其保留为指针,同时需要在其上定义其他方法,因此定义一个新类型B这显然是语言规范所禁止的 接收方通过方法名称前面的额外参数部分指定。该参数部分必须声明一个非可变参数,即接收方。其类型必须是类型T或指向已定义类型T的指针T被称为接收机基本类型接收器基类型不能是指针或

这似乎很基本,但我不能轻易地纠正下面的程序

第一次,我尝试将接收器更改为
func(b*b)
,但没有成功。 对于第二种情况,我尝试了
&B{a}
,但也没有成功


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

这显然是语言规范所禁止的

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


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

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

键入结构{value int}
B型结构{
*A
}
func(b)Print(){
fmt.Printf(“值:%d\n”,b.Value)
}
func main(){
a:=&a{1}
b:=b{a}
b、 打印()
}

B
在这里不是别名;它是一种独特的命名类型,具有与
*a
相同的底层数据结构,但它有自己独特的方法集,没有一个方法集继承自
*a
。错误
B(a)不是类型
是正确的;它是一种类型转换操作,产生一个值,
new
对类型而不是值进行操作。因此,您可以
b:=new(b)
b:=b(a)
。感谢您给出嵌入是一种选择的提示。

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