Google app engine 将结构的切片转换为空接口的切片

Google app engine 将结构的切片转换为空接口的切片,google-app-engine,go,Google App Engine,Go,我试图将结构片分配给片[]接口{}(以传递到AppEngine的数据存储.PutMulti。但是,这会导致编译错误,因为这两种类型显然不兼容: 无法将类型[]*MyStruct用作赋值中的类型[]接口{} 基本上,我有: var src []*MyStruct var dest []interface{} … dest = src // This line fails. 是否有必要将src复制到dest中,而不一次复制每个元素?您必须一次复制一个。这是无法避免的 如果这有助于接受这一点,那么

我试图将结构片分配给片
[]接口{}
(以传递到AppEngine的
数据存储.PutMulti
。但是,这会导致编译错误,因为这两种类型显然不兼容:
无法将类型[]*MyStruct用作赋值中的类型[]接口{}

基本上,我有:

var src []*MyStruct
var dest []interface{}
…
dest = src  // This line fails.

是否有必要将
src
复制到
dest
中,而不一次复制每个元素?

您必须一次复制一个。这是无法避免的


如果这有助于接受这一点,那么您应该考虑这样一个事实:在接口中包装结构实际上是在内存级别包装它。接口包含指向原始类型的指针和类型本身的描述符。将单个结构强制转换为接口时,您实际上是在包装它。因此,一次一个地复制它们是非常必要的为了在接口中包装结构,这是必需的。

这就是我担心的。事实上,它需要一些“工作”在单一情况下强制转换解释了为什么编译器不会只为您使用切片。哦,好吧!请注意,必须这样做的原因是在易于转换为接口和结构级别的间接寻址之间进行权衡。在Go中,赋值(=)不同于复制(内置函数“复制”)。我发现应用程序引擎的go1测试版已更改了
数据存储.PutMulti
的签名,因此上述功能仍然有效。万岁!