先写个小demo:
package main
import(
."fmt"
"encoding/json"
)
type User struct {
UserId int `json:"user_id" bson:"user_id"`
UserName string `json:"user_name" bson:"user_name"`
}
func main() {
u := &User{UserId: 1, UserName: "tony"}
j, _ := json.Marshal(u)
Println(string(j))
Println("-----------")
Println(u)
}
运行结果为:
PS E:\Desktop\我的算法\go语言\demo> go run demo.go
{"user_id":1,"user_name":"tony"}
-----------
&{1 tony}
下面是我?和整理tag设置:
针对JSON的输出,我们在定义struct tag的时候需要注意的几点是:
字段的tag是"-",那么这个字段不会输出到JSON
tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中,例如上面例子中serverName
tag中如果带有"omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中
如果字段类型是bool, string, int, int64等,而tag中带有",string"选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
type Server struct {
// ID 不会导出到JSON中
ID int `json:"-"`
// ServerName 的值会进行二次JSON编码
ServerName string `json:"serverName"`
//含有都是json多个json输出用到的tag的时候
ServerName2 string `json:"serverName2,string"`
// 如果 ServerIP 为空,则不输出到JSON串中
ServerIP string `json:"serverIP,omitempty"`
}
在涉及到beego orm时候tag设置
type studentinfo struct {
//设置主键且为自动增长(可以不设置,默认就是这样)
Id int `pk:"auto"`
//设置字段的长度
Stuname string `orm:"size(20)"`
Stuidentify string `orm:"size(30)"`
Stubirth time.Time
Stuclass string `orm:"size(30)"`
Stumajor string `orm:"size(30)"`
}
type Userinfos struct {
//设置主键自动增长的
Id int `pk:"auto"`
//设置字段的大小
Name string `orm:"size(30)"`
// OneToOne 关系 同时含有json输出格式
Profile *Profile `orm:"rel(one)" json:"profile,omitempty`
//Post []*Post `orm:"reverse(many)"` // 设置一对多的反向关系
}
type Profile struct {
Id int
Age int
Email string
Gender string
// 设置一对一反向关系(可选)
User *Userinfos `orm:"reverse(one)"`
}
type Post struct {
Id int
Title string
//设置多对多关系
Tags []*Tag `orm:"rel(m2m)"`
}
type Tag struct {
Id int
Name string
//设置反向多对多关系
Posts []*Post `orm:"reverse(many)"`
}
点击这儿--->GO官方tag