【解决方案】Golang结构体传0被忽略
【解决方案】Golang结构体传0被忽略
在 Go 语言中,当结构体字段标记为 omitempty 时,在将结构体序列化为 JSON 或其他格式时,如果字段的零值(比如数字类型的0、字符串类型的空字符串等)会被忽略,不会被序列化输出。这样可以减少序列化后的数据大小,使其更加紧凑。
举例
以下是一个简单的示例,展示了结构体中使用 omitempty 标记的字段在序列化时会忽略零值:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age,omitempty"`
}
func main() {
p := Person{Name: "Alice", Age: 0}
// 序列化结构体为 JSON
data, err := json.Marshal(p)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(data))
}
在上面的示例中,Age 字段被标记为 omitempty,所以即使其值为0,最终序列化为 JSON 时,Age 字段不会被包含在输出中。
解决方案
如果想要在序列化时保留零值,可以将被忽略的字段设置为指针类型。以下是修改后的代码示例:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age *int `json:"age,omitempty"`
}
func main() {
age := 0
p := Person{Name: "Alice", Age: &age}
// 序列化结构体为 JSON
data, err := json.Marshal(p)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(data))
}
在这个修改后的代码中,Age字段的类型被更改为*int,这样就可以保留零值。当Age字段的值为零时,它不会被忽略,而是被序列化为0。