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