如何在GO中获取指向接口的指针

我想在下面的代码中去掉变量 temp :


type myinterface interface {

    f1()

}


type a struct {

    val int

}


type b struct {

    mi *myinterface

}


func (a) f1() {


}


    func demo() {


        a1 := a{3}

        var temp myinterface = a1

        b1 := b{&temp}

        fmt.Println(b1)

但是如果我试着写


b1 := b{&myinterface(a1)}

我收到消息


不能获取 myinterface(a1) 的地址(未定义)


这样做的正确方法是什么?


慕勒3428872
浏览 134回答 2
2回答

守着星空守着你

让我知道这是否是您要查找的内容: https ://play.golang.org/p/ZGRyIqN7bPR完整代码:package mainimport (  "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 }

慕妹3146593

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指针)也可以包装在接口中,因此很可能您不需要指向接口的指针。我们必须知道您的“更广泛”目标才能判断这是否是您真正需要的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go