如何在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" 目标才能判断这是否是您真正需要的。
我想去掉下面代码中的变量 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" 目标才能判断这是否是您真正需要的。