gpt4 book ai didi

go - []struct 中附加的不需要的类型

转载 作者:IT王子 更新时间:2023-10-29 01:55:12 27 4
gpt4 key购买 nike

我正在学习 go 和 stuck structs

我需要生成 json:

{
"and" : [
{ "term" : { "name.second" : "ba" } }
]
}
}

所以我可以用代码来做:

package main

import (
"encoding/json"
"fmt"
)

type Term map[string]interface{}

type TermHash struct {
Term `json:"term"`
}

type Filter struct {
And []TermHash `json:"and"`
}

func main() {
var filter Filter
filter.And = append(filter.And, TermHash{ Term{"name.second" : "ba"}})
jsonFilter, _ := json.MarshalIndent(filter, "", " ")
fmt.Printf(string(jsonFilter))
}

但我真的不想使用单独的 TermHash 和 Term 类型,它在代码中似乎是不必要的,仅用于添加此行以进行过滤。我可以避免使用它吗?

我只想通过类型 Filter 完成此操作:

type Filter struct {
And []struct{
Term map[string]interface{} `json:"term"`
} `json:"and"`
}

这看起来更具可读性并且代表了预期的结果,但我不能以这种方式创建 Term 的实例。有没有一种方法可以在不创建单独类型的情况下将 Terms 行添加到 json?

最佳答案

您真正想要的是一种自定义的 JSON 编码方式 Term。它不是一个简单的 map ,而是像一个包含 map 的对象一样进行编码。因此,让我们为它编写自定义 MarshalJSON:

type Term map[string]interface{}

func (t Term) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
T map[string]interface{} `json:"term"`
}{t})
}

我们在这里创建一个匿名的struct,用我们自己填充它,然后将它编码为JSON。请注意此处使用的 map[string]interface{}。虽然它看起来像 Term,但它实际上是一种不同的类型,具有自己的 JSON 编码方式。如果您尝试在此处节省一些输入并使用 T Term,您会发现自己陷入无限循环。 (这种创建与其他类型具有相同结构的新类型的想法是 Go 的主要部分。)

现在我们的数据结构很简单;只是 Term 的一部分:

type Filter struct {
And []Term `json:"and"`
}

func main() {
var filter Filter
filter.And = append(filter.And, Term{"name.second" : "ba"})
jsonFilter, _ := json.MarshalIndent(filter, "", " ")
fmt.Printf(string(jsonFilter))
}

也就是说,您也可以采用另一种方式,让您的数据模型与 JSON 更匹配。在这种情况下,Term 应该是一个结构,而不是一个映射。你可能会这样写:

type Term struct {
Values map[string]interface{} `json:"term"`
}

func NewTerm(key, value string) Term {
return Term{map[string]interface{}{key: value}}
}

type Filter struct {
And []Term `json:"and"`
}

func main() {
var filter Filter
filter.And = append(filter.And, NewTerm("name.second", "ba"))
jsonFilter, _ := json.MarshalIndent(filter, "", " ")
fmt.Printf(string(jsonFilter))
}

关于go - []struct 中附加的不需要的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33805396/

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