GO语言中标识符的可见性:如果定义标识符是大写的,那么对外是可见的,导入包,可以直接使用,如果是小写的,对外是不可见的。
结构体字段的可见性:结构体中的字段首字母大写,该字段对外是可见的,如果首字母小写,该字段对外是不可见的。
JSON键值对是用来保存JS对象的一种方式,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,之后后边跟着键所对应的值,多个键值之间使用英文逗号(,)分隔。
JSON序列化就是:GO语言中的结构体转变成JSON格式的字符串。
JSON反序列化就是:JSON格式的字符串转化成GO语言中的结构体
import (
"encoding/json"
"fmt"
)
//student 结构体
type student struct {
ID int
Name string
}
//构造函数
func newStudent(id int,name string) student {
return student{
ID:id,
Name:name,
}
}
//class 班级
type class struct {
Title string `json:"title"`
Students []student
}
func main(){
c1 := class{
Title: "测试一",
Students: make([]student,0,20),
}
//往班级里插入数据
for i :=0;i <5;i++ {
tempStu := newStudent(i,fmt.Sprintf("stu%02d",i))
c1.Students = append(c1.Students,tempStu)
}
fmt.Printf("%#v\n",c1)
//JSON序列化:Go语言中的数据 -> JSON格式字符串
data,err := json.Marshal(c1)
if err != nil {
fmt.Println("json marshal failed,err:",err)
return
}
fmt.Printf("%T\n",data)
fmt.Printf("%s\n",data)
//JSON反序列化:JSON格式字符串 -> Go语言中的数据
jsonStr := `{"Title":"测试一","Students":[{"ID":0,"Name":"test00"},{"ID":1,"Name":"test01"},{"ID":2,"Name":"test02"},{"ID":3,"Name":"test03"},{"ID":4,"Name":"test04"}]}`
var c2 class
err = json.Unmarshal([]byte(jsonStr),&c2)
if err != nil {
fmt.Println("json unmarshal failed,err:",err)
return
}
fmt.Printf("%#v\n",c2)
}
/* 输出结果
main.class{Title:"测试一", Students:[]main.student{main.student{ID:0, Name:"stu00"}, main.student{ID:1, Name:"stu01"}, main.student{ID:2, Name:"stu02"}, main.student{ID:3, Name:"stu03"}, main.student{ID:4, Name:"stu04"}}}
[]uint8
{"title":"测试一","Students":[{"ID":0,"Name":"stu00"},{"ID":1,"Name":"stu01"},{"ID":2,"Name":"stu02"},{"ID":3,"Name":"stu03"},{"ID":4,"Name":"stu04"}]}
main.class{Title:"测试一", Students:[]main.student{main.student{ID:0, Name:"test00"}, main.student{ID:1, Name:"test01"}, main.student{ID:2, Name:"test02"}, main.student{ID:3, Name:"test03"}, main.student{ID:4, Name:"test04"}}}
*/
复制
结构体标签(Tag)
结构体标签(Tag)是结构体的元信息,在运行的时候通过反射的机制读取出来。Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:
`key1:"value1" key2:"value2"`
复制
结构体tag由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。同一个结构体字段可以设置多个键值对tag,不同的键值对之间使用空格分隔。
注意事项:为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。
type Oraclebigtable struct{
Owner string `json:"Owner" db:"OWNER"`
SegmentName string `json:"SegmentName" db:"SEGMENT_NAME"`
SegmentType string `json:"SegmentType" db:"SEGMENT_TYPE"`
segmentSize float32
}
复制
如上,
1.通过指定tag实现json序列化该字段时的key和db中对应的key
2.如果没有指定tag,json序列化时默认使用字段名作为key
3.私有字段不能被json包访问