go中根据首字母的大小写来确定可以访问的权限。如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用。
1.struct转json序列化
//demo1
package main
import (
"fmt"
"encoding/json"
)
type Person struct {
Name string
age int
}
func main() {
person := Person {"小明", 18}
if result,err :=json.Marshal(&person); err==nil{
fmt.Println(string(result))
}
}
运行结果:{“Name”:“小明”},发现没有年龄,因为struct中age没有首字母大写。
将age修改成Age后,运行结果:{“Name”:“小明”,“Age”:18}
如果想让struct转json序列号后的首字母小写,可以通过字段的tag指定
//demo2
package main
import (
"fmt"
"encoding/json"
)
type Person struct {
Name string `json:"Name"`
Age int `json:"age"`
}
func main() {
person := Person {"小明", 18}
if result,err :=json.Marshal(&person); err==nil{
fmt.Println(string(result))
}
}
2.struct嵌套struct的序列号问题
package main
import (
"encoding/json"
"fmt"
)
type Position struct {
X int
Y int
Z int
}
type Student struct {
Name string
Sex string
Age int
position Position
}
func main() {
position1 := Position{10, 20, 30}
student1 := Student{"zhangsan", "male", 20, position1}
position2 := Position{15, 10, 20}
student2 := Student{"lisi", "female", 18, position2}
var srcSlice = make([]Student, 2)
srcSlice[0] = student1
srcSlice[1] = student2
fmt.Printf("Init:srcSlice is : %v\n", srcSlice)
data, err := json.Marshal(srcSlice)
if err != nil {
fmt.Printf("Serialize:json.Marshal error! %v\n", err)
return
}
fmt.Println("After serialize, data : \n", string(data))
var dstSliece = make([]Student, 2)
err = json.Unmarshal(data, &dstSliece)
if err != nil {
fmt.Printf("Deserialize: json.Unmarshal error! %v\n", err)
return
}
fmt.Printf("Deserialize:dstSlice is : %v\n", dstSliece)
}
运行结果:
Init:srcSlice is : [{zhangsan male 20 {10 20 30}} {lisi female 18 {15 10 20}}]
After serialize, data :
[{"Name":"zhangsan","Sex":"male","Age":20},{"Name":"lisi","Sex":"female","Age":18}]
Deserialize:dstSlice is : [{zhangsan male 20 {0 0 0}} {lisi female 18 {0 0 0}}]
发现序列化的结果没有问题,反序列化的结果中position内容都是0,定位原因是Student中变量名position是小写开头。改成大写后再观察结果,可以正常序列化。
对于json串,很多人喜欢全小写,同样可以通过字段的tag指定。