我们来看一段代码
你觉得14、17、22行的输出分别是什么?
import (
"encoding/json"
"fmt"
)type Data struct {
Oneint
twostring
three int
}func main() {
in := Data{1, "two", 3}
fmt.Printf("%#v\n", in)encoded, _ := json.Marshal(in)
fmt.Println(string(encoded))var out Data
json.Unmarshal(encoded, &out)fmt.Printf("%#v\n", out)
}
定义结构体
type Data struct {
Oneint
twostring
three int
}
在结构中
英文大写字母开头的属性是被导出的
而小写字母开头的属性未导出的
因此
One 属性是被导出的
two、three是未导出的
编码
...
in := Data{1, "two", 3}
fmt.Printf("%#v\n", in) //prints main.MyData{One:1, two:"two", three:3}encoded, _ := json.Marshal(in)
fmt.Println(string(encoded)) //prints {"One":1}
...
在上述2-3行代码,对Data数据结构声明并初始化
在第5行代码这里对结构体进行编码
第6行代码这里只输出了{"One":1}也就是说 未被导出的字段是未被编码的
解码
...
var out Data
json.Unmarshal(encoded, &out)fmt.Printf("%#v\n", out) //prints main.MyData{One:1, two:"",three:0}
...
上述代码第3行对结构体进行解码
第5行代码输出{One:1, two:"",three:0}
未被带出的属性,解码是以零值(zero value)结束
总结
编码结构时,以小写字母开头的struct属性不会被编码(json, xml, gob等)
解码结构时,未导出的字段中以零值(zero value)结束
注:bool的零值(初始值)为 false,int的零值为 0,string的零值为空字符串""
pointer、slice、map、channel、func和interface的零值则是 nil
END
以上便是本期的全部内容
我是红豆,知易行难
【【Go语言陷阱】结构体未导出的字段无法被编解码】我们下期见
推荐阅读
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识