gpt4 book ai didi

json - 在 golang 中将结构与其 json 逻辑分开?

转载 作者:IT王子 更新时间:2023-10-29 01:42:23 25 4
gpt4 key购买 nike

go 中是否有惯用的方法将结构与其 json 编码逻辑分开?

通常:

package models

type Foo struct {
Name `json:"full_name"`
}

但我想要关注点分离。我不希望 json 在带有结构的 models 包中指定逻辑,也许将 json 逻辑放在另一个 serializers包。你会如何用惯用的方式做到这一点?可能类似于 rails 项目如何处理 active_model_serializers 代码

最佳答案

json 标签属于编码逻辑 还是属于 json 模型 是有争议的。我会说指定 json 标签只是描述 json 模型,因此它可能更好地位于您的 Go 模型旁边。

编码/解码逻辑在 encoding/json 中实现包本身。如果您需要自定义逻辑,您可以通过实现 json.Marshaler 来指定/实现它和 json.Unmarshaler接口(interface)。这意味着为您的类型定义方法。在 Go 中,您只能为同一包中的类型指定方法,因此如果您将模型与自定义解析逻辑分开,则解析包无法为模型类型定义方法。 Spec: Method declarations:

The type denoted by T is called the receiver base type; it must not be a pointer or interface type and it must be declared in the same package as the method.

也就是说,您需要在不同类型上定义自定义解析逻辑,并且您需要进一步的逻辑来映射/复制到模型类型中作为解析逻辑的一部分。将模型与解析逻辑分开,你得不偿失。

更进一步,您编码的结构类型可能包含未导出的字段 - 如果解析逻辑在同一个包中 - 可以正确初始化。通过分离模型和逻辑,逻辑在初始化未导出的字段时会遇到麻烦。一种方法是提供导出的方法或函数,然后将它们导出给其他所有人,而不仅仅是用于解析逻辑。

我会说 Go 方式,最简单的方式是将模型和解析逻辑放入同一个包中。它仍然给你一个“小”分离的可能性:你可以将类型定义放在一个文件中(例如 model.go),你可以将自定义解析逻辑(实现 json.Marshaler 的方法) json.Unmarshaler) 在另一个文件中(例如 parse.go)但当然在同一个包中,但最好看到一个类型和它的所有方法都集中在一个地方(在一个文件中)。

关于json - 在 golang 中将结构与其 json 逻辑分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805964/

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