C/C++气象数据中心实战,手把手教你做工业级项目sfsfs

176 阅读1分钟

download:C/C++气象数据中心实战,手把手教你做工业级项目

我们来看一段代码

你觉得14、17、22行的输出分别是什么?

import (

"encoding/json"

"fmt"

)

type Data struct {

One int

two string

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 {

One int

two string

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