GO语言基础教程17——结构体-结构体字段可见和JSON
结构体字段的可见性
结构体中字段大写开头表示可公开访问,小写表示私有(仅在定义当前结构体的包中可访问)。
结构体与JSON序列化与反序列化
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON键值对是用来保存JS对象的一种方式,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值;多个键值之间使用英文,分隔。
type Student struct {
ID int
Gender string
Name string
}
func main() {
s := Student{
ID : 1,
Gender : "男",
Name " "likuis",
}
data,err := JSON.Marshal(s)
if err != nil {
fmt.println("json marshal failed")
return
}
fmt.printf("json : %s\n",data)
json1 := {ID : 1,Name : "likuis"}
s1 := Student{}
err := json.Unmarshal([]byte(json1),s1)
if err != nil {
fmt.println("json marshal failed")
return
}
fmt.printf("json : %s\n",s1)
}
结构体标签(Tag)
Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。 Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下
`key1:"value1" key2:"value2"`
例如我们为Student结构体的每个字段定义json序列化时使用的Tag:
type Student struct {
ID int `json:"id"` //通过指定tag实现json序列化该字段时的key
Gender string //json序列化是默认使用字段名作为key
name string //首字母小写为私有不能被json包访问
}
因为slice和map这两种数据类型都包含了指向底层数据的指针,因此我们在需要复制它们时要特别注意。
func (p *Person) SetDreams(dreams []string) {
p.dreams = dreams
}
// 上面为不正确的
func (p *Person) SetDreams(dreams []string) {
p.dreams = make([]string, len(dreams))
copy(p.dreams, dreams)
}
// 见此示例
结构体课后作业
1、使用“面向对象”的思维方式编写一个学生信息管理系统。学生有id、姓名、年龄、分数等信息 ,程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能。(数据可以用切片保存)