go語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)
go中的tag在結(jié)構(gòu)體中使用的。有兩個(gè)作用:
(1)給結(jié)構(gòu)體屬性起別名,對(duì)于不同類(lèi)型的類(lèi)型對(duì)應(yīng)不同的值,比如xml,yaml,json等分別對(duì)應(yīng)著不同的區(qū)域,當(dāng)然標(biāo)簽也不同。比如json,bson,都是約定俗成的了。
(2)做屬性判斷和驗(yàn)證。
1.tag中的格式
(1)tag本身是一個(gè)字符串,字符串整個(gè)使用反引號(hào)``。
(2)key必須是非空字符串,不能使用雙引號(hào)。字符串不能包含控制字符,空格,引號(hào),冒號(hào)。
(3)value以雙引號(hào)標(biāo)記的字符串。
(4)多個(gè)標(biāo)簽之間使用空格連接,標(biāo)簽名不需要使用雙引號(hào),標(biāo)簽名對(duì)應(yīng)的值需要使用雙引號(hào),多個(gè)標(biāo)簽值需要使用逗號(hào)連接。
舉例:
type User struct { UserId int `json:"user_id" bson:"b_user_id,bson_id"` UserName string `json:"user_name" bson:"b_user_name"` }
注意:冒號(hào)前后不能有空格。
比如以下幾個(gè)就是約定俗成的標(biāo)簽:bson,json,yaml,xml等,當(dāng)然這個(gè)標(biāo)簽是可以自定義的
2.舉例
其實(shí)自己也可以想例子,以下案例作參考。
type Student struct { // 返回給前端的話(huà),首字母大寫(xiě)很奇怪,所以給Name起了個(gè)別名 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類(lèi)型json類(lèi)型 //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)) // 通過(guò)反射獲取標(biāo)簽的值 // reflect.TypeOf(u),獲取的是指針類(lèi)型 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ù)存儲(chǔ)到結(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 在將對(duì)象轉(zhuǎn)化 json 字符串時(shí), // 只要發(fā)現(xiàn)對(duì)象里的 Addr 為 false, 0, 空指針,空接口,空數(shù)組,空切片,空映射,空字符串中的一種,就會(huì)被忽略。 } func testTags() { p1 := &Person{ Name: "zhangsan", } // 所以空字符串就會(huì)被忽略 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,通過(guò)反射 /* 獲取字段 field 獲取標(biāo)簽 tag 獲取鍵值對(duì) key:value // 三種獲取 field field := reflect.TypeOf(obj).FieldByName("Name") field := reflect.ValueOf(obj).Type().Field(i) // i 表示第幾個(gè)字段 field := reflect.ValueOf(&obj).Elem().Type().Field(i) // i 表示第幾個(gè)字段 // 獲取 Tag tag := field.Tag // 獲取鍵值對(duì) 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語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)的文章就介紹到這了,更多相關(guān)go語(yǔ)言結(jié)構(gòu)體tag內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片
- Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法
- Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享
- Go中匿名結(jié)構(gòu)體的使用技巧
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- 詳解Go語(yǔ)言中的結(jié)構(gòu)體的特性
- 一文帶你感受Go語(yǔ)言空結(jié)構(gòu)體的魔力
- 細(xì)說(shuō)Go語(yǔ)言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語(yǔ)言中的結(jié)構(gòu)體
相關(guān)文章
Go 并發(fā)控制context實(shí)現(xiàn)原理剖析(小結(jié))
Golang context是Golang應(yīng)用開(kāi)發(fā)常用的并發(fā)控制技術(shù),這篇文章主要介紹了Go 并發(fā)控制context實(shí)現(xiàn)原理剖析(小結(jié)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Go依賴(lài)注入DI工具wire使用詳解(golang常用庫(kù)包)
依賴(lài)注入是指程序運(yùn)行過(guò)程中,如果需要調(diào)用另一個(gè)對(duì)象協(xié)助時(shí),無(wú)須在代碼中創(chuàng)建被調(diào)用者,而是依賴(lài)于外部的注入,本文結(jié)合示例代碼給大家介紹Go依賴(lài)注入DI工具wire使用,感興趣的朋友一起看看吧2022-04-04詳解如何在Golang中監(jiān)聽(tīng)多個(gè)channel
這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽(tīng)多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03探究gRPC?客戶(hù)端調(diào)用服務(wù)端需要連接池嗎?
這篇文章主要為大家介紹了gRPC?客戶(hù)端調(diào)用服務(wù)端需要連接池嗎的問(wèn)題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例,代碼和圖文講解的很清晰,有感興趣的可以學(xué)習(xí)下2021-03-03golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用
時(shí)間和日期是我們編程中經(jīng)常會(huì)用到的,本文主要介紹了golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10