【问题标题】:Cast a struct pointer to interface pointer in Golang在Golang中将结构指针转换为接口指针
【发布时间】:2015-01-26 12:30:46
【问题描述】:

我有一个功能

func doStuff(inout *interface{}) {
   ...
}

此函数的目的是能够将任何类型的指针视为输入。 但是当我想用结构的指针调用它时,我遇到了错误。

type MyStruct struct {
    f1 int
}

拨打doStuff

ms := MyStruct{1}
doStuff(&ms)

我有

test.go:38: cannot use &ms (type *MyStruct) as type **interface {} in argument to doStuff

如何将&ms 转换为与*interface{} 兼容?

【问题讨论】:

    标签: pointers struct interface casting go


    【解决方案1】:

    没有“指向接口的指针”之类的东西(从技术上讲,您可以使用它,但通常您不需要它)。

    如“what is the meaning of interface{} in golang?”中所见,interface 是一个包含两个数据字的容器:

    • 一个词用于指向值的基础类型的方法表,
    • 另一个词用于指向该值所持有的实际数据。

    所以去掉指针,doStuff 就可以正常工作了:接口数据将是&ms,你的指针:

    func doStuff(inout interface{}) {
       ...
    }
    

    this example:

    ms := MyStruct{1}
    doStuff(&ms)
    fmt.Printf("Hello, playground: %v\n", ms)
    

    输出:

    Hello, playground: {1}
    

    正如newacct 提到in the comments

    直接将指针传递给接口是有效的,因为如果MyStruct 符合协议,那么*MyStruct 也符合协议(因为类型的方法集包含在其指针类型的方法集中)。

    在这种情况下,接口是空接口,因此无论如何它都接受所有类型,但仍然。

    【讨论】:

    • 太好了,你让我开心!
    • 接口变量如何在内部工作与问题无关。从语义上讲,接口变量包含分配它的值的副本,就像 Go 中的任何其他类型一样。在它下面是用一个指向数据的不可变指针来实现的,但这对程序员来说是不可见的。
    • 你应该解释直接将指针传递给接口是有效的,因为如果MyStruct符合协议,那么*MyStruct也符合协议(因为类型的方法集包含在其指针中类型的方法集)。在这种情况下,接口是空接口,因此无论如何它都接受所有类型,但仍然。
    • @newacct 好点。为了提高知名度,我已将您的第二条评论包含在答案中。
    • 有趣的是,您可以通过访问 Type.Elem() 函数来处理传递给函数的指针。这使您可以有一个可比较的例子,例如reflect.TypeOf(&MyStruct{}).Elem() == reflect.TypeOf(MyStruct) 请参阅play.golang.org/p/DGb87RUZqJ
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多