在Golang中将结构指针转换为接口指针

Posted

技术标签:

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

我有一个功能

func doStuff(inout *interface) 
   ...

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

type MyStruct struct 
    f1 int

拨打doStuff

ms := MyStruct1
doStuff(&ms)

我有

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

func doStuff(inout interface) 
   ...

见this example:

ms := MyStruct1
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

以上是关于在Golang中将结构指针转换为接口指针的主要内容,如果未能解决你的问题,请参考以下文章

在Golang里如何实现结构体成员指针到结构体自身指针的转换

Visual Studio 调试中将结构体指针转换为结构体数组查看

将结构指针转换为接口

带有指针的 Golang 类型断言

如何在 C++ 中将指针转换/转换为引用

Golang中函数结构体,将函数转换为接口