Go 中结构体切片之间的类型转换
在 Go 中,结构体切片之间的类型转换可能具有挑战性。考虑以下代码:
<code class="go">type Societe struct { Name string } type ListSociete []Societe func loadListSociete(name string) (ListSociete, error) { res := []struct { Name string `json:"a.name"` }{} // ... return ListSociete(res), nil }</code>
当尝试将 res 转换为 ListSociete 时,它会失败,因为这些类型本质上不可互换。虽然两者共享相似的底层结构,但 res 中 JSON 标签的存在将它们区分开来。
关键区别:结构类型中的标签
Go 规范指出两个如果结构类型具有相同的字段、名称、类型和标签序列,则它们是相同的。 res 类型包含标签 json:"a.name",它与 Societe 区分开来。
转换选项
在这些类型之间进行转换有两个主要选项:
迭代和复制:
迭代 res 中的每个元素,通过复制每个元素的 Name 字段来创建一个新的 ListSociete。虽然安全,但此方法冗长且低效。
<code class="go">ls := make(ListSociete, len(res)) for i := 0; i < len(res); i++ { ls[i].Name = res[i].Name }</code>
不安全转换:
利用共享底层数据结构执行不安全操作类型转换。但是,不建议这样做,因为它可能会导致意外错误。
<code class="go">return *(*ListSociete)(unsafe.Pointer(&res)), nil</code>
结论
结构体切片之间的类型转换可以是使用迭代和复制或不安全转换来实现。选择取决于所涉及的要求和风险。了解所涉及类型之间的差异以及任何转换方法的潜在后果非常重要。
以上是如何在 Go 中转换具有不同 JSON 标签的结构体切片?的详细内容。更多信息请关注PHP中文网其他相关文章!