2012-02-02 71 views
4

我想结构的切片分配到片[]interface{}(通到AppEngine上的datastore.PutMulti。然而,这是导致编译错误的两种类型显然是不兼容的:
cannot use type[]*MyStruct as type []interface { } in assignment转换结构的切片切空接口

基本上我有:

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

反正是有src复制到dest而不复制一个-AT-A-时间每个元素

+0

在Go中,赋值(=)与复制(内置函数'copy')不同。 – 2012-02-03 19:26:22

+0

我发现应用程序引擎的go1测试版已经改变了'datastore.PutMulti'的签名,所以上面的工作无论如何都起作用。欢呼! – djd 2012-02-10 03:38:01

回答

6

你将不得不一次性复制。没有办法绕过它。

如果它有助于接受这个问题,你应该考虑一个事实,即在接口中包装一个结构实际上确实将它包装在内存级别。一个接口包含一个指向原始类型的指针和一个类型本身的描述符。在将单个结构投射到接口时,实际上是在包装它。因此,为了将结构包装在界面中,需要一次一个地复制它们。

+0

这就是我所害怕的。事实上,在单个案例中需要一些“工作”才能解释为什么编译器不会仅仅为切片完成。好吧! – djd 2012-02-02 23:43:02

+0

请注意,必须这样做的原因是在结构级别上易于转换为接口和间接之间的折衷。 – Jessta 2012-02-09 10:39:11