亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2023年10月08日 14:54:49   作者:曉風殘月一望關河蕭索  
Go語言是一種靜態(tài)類型、編譯型的編程語言,其中結(jié)構(gòu)體是一種非常重要的數(shù)據(jù)類型,本文就來介紹一下go語言中結(jié)構(gòu)體tag使用,具有一定的參考價值,感興趣的可以了解一下

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

    Golang context是Golang應用開發(fā)常用的并發(fā)控制技術,這篇文章主要介紹了Go 并發(fā)控制context實現(xiàn)原理剖析(小結(jié)),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Go依賴注入DI工具wire使用詳解(golang常用庫包)

    Go依賴注入DI工具wire使用詳解(golang常用庫包)

    依賴注入是指程序運行過程中,如果需要調(diào)用另一個對象協(xié)助時,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入,本文結(jié)合示例代碼給大家介紹Go依賴注入DI工具wire使用,感興趣的朋友一起看看吧
    2022-04-04
  • 詳解如何在Golang中監(jiān)聽多個channel

    詳解如何在Golang中監(jiān)聽多個channel

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

    Go語言JSON解析器gjson使用方法詳解

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

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

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

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

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

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

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

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

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

    Golang中的crypto/ecdh包使用詳解

    這篇文章主要給大家詳細介紹了Golang 中的 crypto/ecdh 包,主要包括什么是ECDH 算法和crypto/ecdh 包的使用方法,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • golang標準庫time時間包的使用

    golang標準庫time時間包的使用

    時間和日期是我們編程中經(jīng)常會用到的,本文主要介紹了golang標準庫time時間包的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論