go語言中結(jié)構(gòu)體tag使用小結(jié)
go中的tag在結(jié)構(gòu)體中使用的。有兩個作用:
(1)給結(jié)構(gòu)體屬性起別名,對于不同類型的類型對應不同的值,比如xml,yaml,json等分別對應著不同的區(qū)域,當然標簽也不同。比如json,bson,都是約定俗成的了。
(2)做屬性判斷和驗證。
1.tag中的格式
(1)tag本身是一個字符串,字符串整個使用反引號``。
(2)key必須是非空字符串,不能使用雙引號。字符串不能包含控制字符,空格,引號,冒號。
(3)value以雙引號標記的字符串。
(4)多個標簽之間使用空格連接,標簽名不需要使用雙引號,標簽名對應的值需要使用雙引號,多個標簽值需要使用逗號連接。
舉例:
type User struct { UserId int `json:"user_id" bson:"b_user_id,bson_id"` UserName string `json:"user_name" bson:"b_user_name"` }
注意:冒號前后不能有空格。
比如以下幾個就是約定俗成的標簽:bson,json,yaml,xml等,當然這個標簽是可以自定義的
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)) // 通過反射獲取標簽的值 // 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 獲取標簽 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) }
到此這篇關于go語言中結(jié)構(gòu)體tag使用小結(jié)的文章就介紹到這了,更多相關go語言結(jié)構(gòu)體tag內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 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)體的魔力
- 細說Go語言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語言中的結(jié)構(gòu)體
相關文章
Go 并發(fā)控制context實現(xiàn)原理剖析(小結(jié))
Golang context是Golang應用開發(fā)常用的并發(fā)控制技術,這篇文章主要介紹了Go 并發(fā)控制context實現(xiàn)原理剖析(小結(jié)),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10Go依賴注入DI工具wire使用詳解(golang常用庫包)
依賴注入是指程序運行過程中,如果需要調(diào)用另一個對象協(xié)助時,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入,本文結(jié)合示例代碼給大家介紹Go依賴注入DI工具wire使用,感興趣的朋友一起看看吧2022-04-04