gpt4 book ai didi

go - 使用标签转换 Go struct 字段

转载 作者:IT王子 更新时间:2023-10-29 02:05:09 26 4
gpt4 key购买 nike

我真的被 Go 中一个看似微不足道的问题困在这里:我有一个 Golang 微服务,它以 json 格式输出数据。假设我有一个带有 json 标签的简单结构用于此结果:

type Result struct {
Name string `json:"name"`
Age int `json:"age"`
}

在实际从数据库中提取数据的代码部分,我有一个非常相似的结构,如下所示:

type ResultBackend struct {
Name string `bson:"fullName"`
Age int `bson:"age"`
}

struct 字段类似,只是标签不同。我想保持简单,只从后端服务 (ResultBackend) 返回一个结构,然后可以将其作为 JSON 响应发送,如下所示:

func process() Result {
var result ResultBackend
... do a MongoDB query here and store results in result variable ...
return result
}

这肯定行不通,因为我们这里有两个不同的结构。当然,一种解决方案是将两个标签嵌入一个结构中,如下所示:

type Result struct {
Name string `json:"name" bson:"fullName"`
Age int `json:"age bson:"age"`
}

然后在主代码和“进程”函数中使用这个结构。这行得通,但这似乎是用 bson 标签“毒化”了主代码的 Result 结构。例如,如果后端结果是 XML 文件怎么办?我还必须将 xml 标记添加到结构中。或者也许有一天标记一些非常模糊的数据库适配器。在我看来,这似乎不是最干净的方法。我宁愿在主代码中有一个干净的 Result 结构,并且只是从一个结构到另一个结构的转换。

有什么简单的方法可以做到这一点,还是我真的必须将 ResultBackend 结构的所有字段复制到新的 Result 结构并返回它?或者我想在这里过度简化我的代码? :)

干杯!

最佳答案

如果您愿意,我要做的是为每个“序列化格式”创建一个单独的类型。这种方法有几个优点:

  • 你的关注点是分开的。

  • JSON 解/编码不会干扰 BSON/XML,因此您可以添加任何类型的额外结构字段(例如 xml.Name)。

  • 您实际上可以为需要不同参数的不同 API 创建多个此类类型。

我看到的唯一缺点是在它们之间移动数据的代码越来越多。最终取决于您和您的应用程序设计。如果您确定您的 JSON/BSON 将保持不变,您可以使用一种类型。否则,我建议特化。

关于go - 使用标签转换 Go struct 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31791045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com