我试图省略 nil 接口值
package main
import (
"fmt"
"encoding/json"
)
type MyStruct struct{
Val interface{} `json:"val,omitempty"`
}
func main() {
var s []string
s = nil
m := MyStruct{
Val : s,
}
b, _:= json.Marshal(m)
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)
这是操场链接https://play.golang.org/p/cAE1IrSPgm 这输出
{"val":null}
Run Code Online (Sandbox Code Playgroud)
为什么不将其视为空值?有没有办法从 json.json 中省略这些 nil 值。
小智 7
从文档:
结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,除非
- 该字段的标签是“-”,或
- 该字段为空,其标签指定了“omitempty”选项。
空值是 false、0、任何 nil 指针或接口值,以及任何长度为零的数组、切片、映射或字符串。
未省略的原因在此处说明
仅当内部值和类型都未设置时,接口值才为零 (nil, nil)。特别是,一个 nil 接口将始终持有一个 nil 类型。如果我们在接口值中存储一个 *int 类型的 nil 指针,则无论指针的值如何,内部类型都将是 *int:(*int, nil)。因此,即使内部指针为零,这样的接口值也将是非零的。
例如:
var s []string
s = nil
var temp interface{}
fmt.Println(temp==nil) // true
temp = s
fmt.Println(temp==nil) // false
Run Code Online (Sandbox Code Playgroud)
对于你的情况,你可以做
https://play.golang.org/p/ZZ_Vzwq4QF
或
https://play.golang.org/p/S5lMgqVXuB