暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Go语言基础-结构体字段可见性和JSON

学徒杨新建 2020-09-01
1361

GO语言中标识符的可见性:如果定义标识符是大写的,那么对外是可见的,导入包,可以直接使用,如果是小写的,对外是不可见的。 
结构体字段的可见性:结构体中的字段首字母大写,该字段对外是可见的,如果首字母小写,该字段对外是不可见的。

JSON键值对是用来保存JS对象的一种方式,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,之后后边跟着键所对应的值,多个键值之间使用英文逗号(,)分隔。 
JSON序列化就是:GO语言中的结构体转变成JSON格式的字符串。 
JSON反序列化就是:JSON格式的字符串转化成GO语言中的结构体

  1. import (

  2. "encoding/json"

  3. "fmt"

  4. )

  5. //student 结构体

  6. type student struct {

  7. ID int

  8. Name string

  9. }

  10. //构造函数

  11. func newStudent(id int,name string) student {

  12. return student{

  13. ID:id,

  14. Name:name,

  15. }

  16. }

  17. //class 班级

  18. type class struct {

  19. Title string `json:"title"`

  20. Students []student

  21. }


  22. func main(){

  23. c1 := class{

  24. Title: "测试一",

  25. Students: make([]student,0,20),

  26. }

  27. //往班级里插入数据

  28. for i :=0;i <5;i++ {

  29. tempStu := newStudent(i,fmt.Sprintf("stu%02d",i))

  30. c1.Students = append(c1.Students,tempStu)

  31. }

  32. fmt.Printf("%#v\n",c1)

  33. //JSON序列化:Go语言中的数据 -> JSON格式字符串

  34. data,err := json.Marshal(c1)

  35. if err != nil {

  36. fmt.Println("json marshal failed,err:",err)

  37. return

  38. }

  39. fmt.Printf("%T\n",data)

  40. fmt.Printf("%s\n",data)

  41. //JSON反序列化:JSON格式字符串 -> Go语言中的数据

  42. jsonStr := `{"Title":"测试一","Students":[{"ID":0,"Name":"test00"},{"ID":1,"Name":"test01"},{"ID":2,"Name":"test02"},{"ID":3,"Name":"test03"},{"ID":4,"Name":"test04"}]}`

  43. var c2 class

  44. err = json.Unmarshal([]byte(jsonStr),&c2)

  45. if err != nil {

  46. fmt.Println("json unmarshal failed,err:",err)

  47. return

  48. }

  49. fmt.Printf("%#v\n",c2)

  50. }

  51. /* 输出结果

  52. 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"}}}

  53. []uint8

  54. {"title":"测试一","Students":[{"ID":0,"Name":"stu00"},{"ID":1,"Name":"stu01"},{"ID":2,"Name":"stu02"},{"ID":3,"Name":"stu03"},{"ID":4,"Name":"stu04"}]}

  55. 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"}}}

  56. */

复制

结构体标签(Tag)

结构体标签(Tag)是结构体的元信息,在运行的时候通过反射的机制读取出来。Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:

  1. `key1:"value1" key2:"value2"`

复制

结构体tag由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。同一个结构体字段可以设置多个键值对tag,不同的键值对之间使用空格分隔。 
注意事项:为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。

  1. type Oraclebigtable struct{

  2. Owner string `json:"Owner" db:"OWNER"`

  3. SegmentName string `json:"SegmentName" db:"SEGMENT_NAME"`

  4. SegmentType string `json:"SegmentType" db:"SEGMENT_TYPE"`

  5. segmentSize float32

  6. }

复制

如上, 
1.通过指定tag实现json序列化该字段时的key和db中对应的key 
2.如果没有指定tag,json序列化时默认使用字段名作为key 
3.私有字段不能被json包访问

文章转载自学徒杨新建,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论