欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)

 更新時(shí)間:2023年10月08日 14:54:49   作者:曉風(fēng)殘?jiān)乱煌P(guān)河蕭索  
Go語(yǔ)言是一種靜態(tài)類(lèi)型、編譯型的編程語(yǔ)言,其中結(jié)構(gòu)體是一種非常重要的數(shù)據(jù)類(lèi)型,本文就來(lái)介紹一下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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go 并發(fā)控制context實(shí)現(xiàn)原理剖析(小結(jié))

    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-10
  • Go依賴(lài)注入DI工具wire使用詳解(golang常用庫(kù)包)

    Go依賴(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

    詳解如何在Golang中監(jiān)聽(tīng)多個(gè)channel

    這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽(tīng)多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Go語(yǔ)言JSON解析器gjson使用方法詳解

    Go語(yǔ)言JSON解析器gjson使用方法詳解

    這篇文章主要介紹了Go語(yǔ)言json解析框架與gjson,JSON?解析是我們不可避免的常見(jiàn)問(wèn)題,在Go語(yǔ)言中,我們可以借助gjson庫(kù)來(lái)方便的進(jìn)行json屬性的提取與解析,需要的朋友可以參考一下
    2022-12-12
  • 探究gRPC?客戶(hù)端調(diào)用服務(wù)端需要連接池嗎?

    探究gRPC?客戶(hù)端調(diào)用服務(wù)端需要連接池嗎?

    這篇文章主要為大家介紹了gRPC?客戶(hù)端調(diào)用服務(wù)端需要連接池嗎的問(wèn)題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例

    Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例,代碼和圖文講解的很清晰,有感興趣的可以學(xué)習(xí)下
    2021-03-03
  • golang中數(shù)組與切片的區(qū)別詳析

    golang中數(shù)組與切片的區(qū)別詳析

    數(shù)組是固定長(zhǎng)度,常量,切片長(zhǎng)度是可以改變,所以是一個(gè)可變的數(shù)組,下面這篇文章主要給大家介紹了關(guān)于golang中數(shù)組與切片區(qū)別的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • golang讀取yaml配置文件的示例代碼

    golang讀取yaml配置文件的示例代碼

    在項(xiàng)目開(kāi)發(fā)中,經(jīng)常需要把一些配置文件常量提取到統(tǒng)一配置文件進(jìn)行維護(hù),go項(xiàng)目在開(kāi)發(fā)中常常把需要維護(hù)的常量或者配置提取到y(tǒng)aml文件,所以本文主要來(lái)為大家介紹一下golang如何讀取yaml配置文件吧
    2023-11-11
  • Golang中的crypto/ecdh包使用詳解

    Golang中的crypto/ecdh包使用詳解

    這篇文章主要給大家詳細(xì)介紹了Golang 中的 crypto/ecdh 包,主要包括什么是ECDH 算法和crypto/ecdh 包的使用方法,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用

    golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用

    時(shí)間和日期是我們編程中經(jīng)常會(huì)用到的,本文主要介紹了golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論