为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕勒3428872 2023-06-05 18:34:46
我想在下面的代码中去掉变量 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) 的地址(未定义)这样做的正确方法是什么?
查看完整描述

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

 }


查看完整回答
反对 回复 2023-06-05
?
慕妹3146593

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指针)也可以包装在接口中,因此很可能您不需要指向接口的指针。我们必须知道您的“更广泛”目标才能判断这是否是您真正需要的。


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信