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

How to get pointer to interface in 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)}

我收到消息

cannot take the address of myinterface(a1) ( undefined )

正确的做法是什么?

更新:

我没有指向接口的指针,因为接口可以包含结构或指向结构的指针,这个问题中也有详细说明:

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

myinterface(a1) 是一个类型 conversion,它将 a1 转换为类型 myinteface.

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

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

The operand must be addressable, that is, either a variable, pointer indirection, or slice indexing operation; or a field selector of an addressable struct operand; or an array indexing operation of an addressable array. As an exception to the addressability requirement, x [in the expression of &x] may also be a (possibly parenthesized) composite literal.

这个相关的答案列出了几个如何获取此类表达式地址的选项:

例如,如果您使用复合文字创建一个 []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 指针)也可以包装在接口中,所以很可能你不需要指向的指针界面。我们必须知道您的 "wider" 目标才能判断这是否是您真正需要的。