【问题标题】:Converting slice of structs to slice of empty interface将结构切片转换为空接口切片
【发布时间】:2012-02-25 15:35:34
【问题描述】:

我正在尝试将一个结构切片分配给一个切片 []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 而不一次复制每个元素?

【问题讨论】:

  • 在 Go 中,赋值 (=) 不同于复制(内置函数 'copy')。
  • 我发现应用引擎的 go1 测试版已经更改了 datastore.PutMulti 的签名,因此上述方法仍然有效。万岁!

标签: google-app-engine go


【解决方案1】:

您将不得不一次复制一份。没有办法解决。

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

【讨论】:

  • 这就是我所担心的。在单一情况下转换需要一些“工作”这一事实解释了为什么编译器不会只为您使用切片。哦,好吧!
  • 请注意,必须这样做的原因是在轻松转换为接口和结构级别的间接之间进行权衡。
猜你喜欢
  • 2020-02-03
  • 2020-09-12
  • 2020-04-17
  • 2018-01-04
  • 2012-10-11
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多