go語言中結(jié)構(gòu)體tag使用小結(jié)
go中的tag在結(jié)構(gòu)體中使用的。有兩個作用:
(1)給結(jié)構(gòu)體屬性起別名,對于不同類型的類型對應(yīng)不同的值,比如xml,yaml,json等分別對應(yīng)著不同的區(qū)域,當(dāng)然標(biāo)簽也不同。比如json,bson,都是約定俗成的了。
(2)做屬性判斷和驗證。
1.tag中的格式
(1)tag本身是一個字符串,字符串整個使用反引號``。
(2)key必須是非空字符串,不能使用雙引號。字符串不能包含控制字符,空格,引號,冒號。
(3)value以雙引號標(biāo)記的字符串。
(4)多個標(biāo)簽之間使用空格連接,標(biāo)簽名不需要使用雙引號,標(biāo)簽名對應(yīng)的值需要使用雙引號,多個標(biāo)簽值需要使用逗號連接。
舉例:
type User struct {
UserId int `json:"user_id" bson:"b_user_id,bson_id"`
UserName string `json:"user_name" bson:"b_user_name"`
}注意:冒號前后不能有空格。
比如以下幾個就是約定俗成的標(biāo)簽:bson,json,yaml,xml等,當(dāng)然這個標(biāo)簽是可以自定義的

2.舉例
其實自己也可以想例子,以下案例作參考。
type Student struct {
// 返回給前端的話,首字母大寫很奇怪,所以給Name起了個別名
Name string `json:"name"`
Age int
}
func testTag() {
s1 := Student{
Name: "s1k",
}
bytes, err := json.Marshal(s1)
if err != nil {
panic(err)
}
// 將[]byte數(shù)組轉(zhuǎn)換為string類型json類型
//s := string(bytes)
var s Student
json.Unmarshal(bytes, &s)
fmt.Printf("%v", s)
}
type User struct {
UserId int `json:"user_id" bson:"b_user_id"`
UserName string `json:"user_name" bson:"b_user_name"`
}
func testJson() {
u := &User{
UserId: 1,
UserName: "tony",
}
fmt.Printf("%T", u)
bytes, _ := json.Marshal(u)
fmt.Println(string(bytes))
// 通過反射獲取標(biāo)簽的值
// reflect.TypeOf(u),獲取的是指針類型
types := reflect.TypeOf(u)
field := types.Elem().Field(0)
fmt.Println(field.Tag.Get("json"))
fmt.Println(field.Tag.Get("bson"))
}
type Http struct {
Port string `yaml:"port"`
Secret string `yaml:"secretKey"`
Domain string `yaml:"domain"`
}
type Config struct {
Http `yaml:"http"`
}
func testYaml() {
//var h Http
config := new(Config)
file, err := ioutil.ReadFile("config.yaml")
if err != nil {
fmt.Println(err.Error())
}
// 將解析后的數(shù)據(jù)存儲到結(jié)構(gòu)體中
err = yaml.Unmarshal(file, config)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(config.Http, " ", config.Port, " ", config.Secret, " ", config.Domain)
}
type Person struct {
Name string `json:"name"`
Age string `json:"age,omitempty"` //有 omitempty 屬性,因此 encoding/json 在將對象轉(zhuǎn)化 json 字符串時,
// 只要發(fā)現(xiàn)對象里的 Addr 為 false, 0, 空指針,空接口,空數(shù)組,空切片,空映射,空字符串中的一種,就會被忽略。
}
func testTags() {
p1 := &Person{
Name: "zhangsan",
}
// 所以空字符串就會被忽略
bytes, _ := json.Marshal(p1)
fmt.Printf("%s", bytes)
fmt.Println(p1)
fmt.Printf("%T", p1)
p2 := &Person{
Name: "lisi",
Age: "15",
}
fmt.Println(p2)
}
// 從結(jié)構(gòu)體中取出tag,通過反射
/*
獲取字段 field
獲取標(biāo)簽 tag
獲取鍵值對 key:value
// 三種獲取 field
field := reflect.TypeOf(obj).FieldByName("Name")
field := reflect.ValueOf(obj).Type().Field(i) // i 表示第幾個字段
field := reflect.ValueOf(&obj).Elem().Type().Field(i) // i 表示第幾個字段
// 獲取 Tag
tag := field.Tag
// 獲取鍵值對
labelValue := tag.Get("label")
labelValue,ok := tag.Lookup("label")
*/
func getTag() {
p2 := &Person{
Name: "lisi",
Age: "15",
}
// 三種方式獲取Field
field := reflect.ValueOf(p2).Elem().Type().Field(1)
getName := field.Tag.Get("json")
// 獲取tag
//value, ok := tag.Lookup("name")
fmt.Println(getName)
}到此這篇關(guān)于go語言中結(jié)構(gòu)體tag使用小結(jié)的文章就介紹到這了,更多相關(guān)go語言結(jié)構(gòu)體tag內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang使用泛型結(jié)構(gòu)體實現(xiàn)封裝切片
- Golang?中判斷兩個結(jié)構(gòu)體相等的方法
- Go語言中結(jié)構(gòu)體的高級技巧分享
- Go中匿名結(jié)構(gòu)體的使用技巧
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- 詳解Go語言中的結(jié)構(gòu)體的特性
- 一文帶你感受Go語言空結(jié)構(gòu)體的魔力
- 細(xì)說Go語言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語言中的結(jié)構(gòu)體
相關(guān)文章
Go語言使用Timeout Context取消任務(wù)的實現(xiàn)
本文主要介紹了Go語言使用Timeout Context取消任務(wù)的實現(xiàn),包括基本的任務(wù)取消和控制HTTP客戶端請求的超時,具有一定的參考價值,感興趣的可以了解一下2024-01-01

