首页  >  文章  >  后端开发  >  如何在 Go 中转换具有不同 JSON 标签的结构体切片?

如何在 Go 中转换具有不同 JSON 标签的结构体切片?

Barbara Streisand
Barbara Streisand原创
2024-10-26 18:06:30714浏览

How to Convert Slices of Structs with Different JSON Tags in Go?

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 区分开来。

转换选项

在这些类型之间进行转换有两个主要选项:

  1. 迭代和复制:

    迭代 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>
  2. 不安全转换:

    利用共享底层数据结构执行不安全操作类型转换。但是,不建议这样做,因为它可能会导致意外错误。

    <code class="go">return *(*ListSociete)(unsafe.Pointer(&res)), nil</code>

结论

结构体切片之间的类型转换可以是使用迭代和复制或不安全转换来实现。选择取决于所涉及的要求和风险。了解所涉及类型之间的差异以及任何转换方法的潜在后果非常重要。

以上是如何在 Go 中转换具有不同 JSON 标签的结构体切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn