go语言开发基础26 - 之go语言里结构体的tag使用

Golang中可以为结构体的字段添加tag,这类似于Java中为类的属性添加的注解,Golang本身的encoding/json包解析json使用了tag,一些开源的ORM框架,也广泛使用了tag,那么,我们如何通过代码自己实现tag的解析,从而简化结构体字段的使用方式呢?下面看一个例子。

示例

1、问题示例

package main

import (
	"encoding/json"
	"fmt"
)

type Student1 struct {
	name  string
	age   int
	score int
}

func main() {
    var stu Student1 = Student1{
		name:  "张三",
		age:   22,
		score: 88,
	}

	data, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("Json Encoding Error: ", err)
		return
	}
	fmt.Println(string(data))     // 结果为:{}
}

  

说明:为什么结果是:{}那?这是因为json是encoding包下的方法,而结构体里的字段首字母是小写的(不支持导出),所以结果是:{}

解决:我们只需要将结构体里的字段首字母改成大写就可以了。

问题:我希望json序列化后得到的是全小写的字段,这要怎么实现那?这里就可以引出tag的概念,下面看tag的示例

2、tag示例

package main

import (
	"encoding/json"
	"fmt"
)

type Student2 struct {
	Name  string `json:"name"`       // `json:"name"`:这就是指定的tag,表示json序列化时,结构体里的字段展示形式为name
	Age   int `json:"age"`
	Score int `json:"score"`
}

func main() {
	var stu Student2 = Student2{
		Name:  "张三",
		Age:   22,
		Score: 88,
	}

	data, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("Json Encoding Error: ", err)
		return
	}
	fmt.Println(string(data))     // 结果为:{"name":"张三","age":22,"score":88}
} 

  

这里我们发现结构体里的字段首字母是大写,最总json序列化出来的结果是小写的,这就是tag的功能。

posted @ 2020-07-01 17:31  欧-阳  阅读(739)  评论(0)    收藏  举报