【问题标题】:How to get pointer to interface in GO如何在GO中获取指向接口的指针
【发布时间】:2019-07-07 06:47:25
【问题描述】:

我想去掉下面代码中的变量 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)的地址(未定义)

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

更新:

我没有指向接口的指针,因为接口可以保存结构或指向结构的指针,正如这个问题中所详述的:

"<type> is pointer to interface, not interface" confusion

【问题讨论】:

    标签: pointers go casting temporary


    【解决方案1】:

    如果这是您要找的,请告诉我: 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)
    }
    

    您几乎不需要指向接口的指针,因为接口本身就是指针。 所以只需将结构 b 更改为:

     type b struct {
       mi myinterface
     }
    

    【讨论】:

    • 谢谢,这几乎正是我所需要的。我只是将其更改为 a1 := a{3} b1 := b{&a1}。我认为您应该将来源放在答案中,而不是提供链接。那我就可以接受答案了。
    【解决方案2】:

    myinterface(a1)conversion 类型,它将a1 转换为myinteface 类型。

    类型转换表达式是不可寻址的,所以你不能取它的地址。 Spec: Address operators:

    中明确列出了可寻址的内容

    操作数必须是可寻址的,即可以是变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x [在&amp;x 的表达式中] 也可以是(可能用括号括起来的)composite literal

    此相关答案列出了如何获取此类表达式的地址的几个选项:How do I do a literal *int64 in Go?

    例如,如果您使用复合字面量创建[]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 指针)也可以包装在接口中,因此很可能您不需要指向接口的指针。我们必须知道您的“更广泛”目标才能判断这是否是您真正需要的。

    【讨论】:

    • 你是对的,我不需要指向接口的指针。我想通过一个接口保存数据,但也让它指向原始数据,而不是创建一个副本。没想到数据的地址也是可以赋值给接口的。
    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多