2 回答
TA贡献1799条经验 获得超8个赞
让我知道这是否是您要查找的内容: https ://play.golang.org/p/ZGRyIqN7bPR
完整代码:
package main
import (
"fmt"
)
type myinterface interface {
f1()
}
type a struct {
val int
}
type b struct {
mi myinterface
}
func (a) f1() {}
func main() {
fmt.Println("Hello, playground")
a1 := &a{3}
b1 := b{a1}
fmt.Println(b1)
}
您几乎永远不需要指向接口的指针,因为接口本身就是指针。所以只需将 struct b 更改为:
type b struct {
mi myinterface
}
TA贡献1820条经验 获得超9个赞
myinterface(a1)
是类型转换,它转换a1
为类型myinteface
。
类型转换表达式是不可寻址的,所以你不能获取它的地址。什么是可寻址的在规范中明确列出:地址运算符:
操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,
x
[在 ] 的表达式中&x
也可以是一个(可能带括号的)复合文字。
例如,如果您使用复合文字创建一个类型的切片[]myinterface
并将其放入a1
其中,您可以获取其第一个元素(类型为*myinterface
)的地址:
b1 := b{&[]myinterface{a1}[0]}
它会起作用(在Go Playground上试试):
a1 := a{3} b1 := b{&[]myinterface{a1}[0]} fmt.Println(b1)
但是知道很少需要使用指向接口的指针,那么类型字段*myinterface
真的是您首先想要的吗?
接口值可以是nil
,并且nil
值(例如nil
指针)也可以包装在接口中,因此很可能您不需要指向接口的指针。我们必须知道您的“更广泛”目标才能判断这是否是您真正需要的。
- 2 回答
- 0 关注
- 133 浏览
添加回答
举报