在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里如何实现结构体成员指针到结构体自身指针的转换