最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 后端golang項目一鍵打包部署方案

    后端golang項目一鍵打包部署方案

    本文介紹了如何為Go語言Gin項目添加一鍵打包并自動部署功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • Go語言實現(xiàn)請求頻率限制的方法實踐

    Go語言實現(xiàn)請求頻率限制的方法實踐

    本文介紹了Go語言中四種主流的請求限流方案,包括計數(shù)器法、Redis滑動窗口、令牌桶算法和使用成熟中間件,每種方案都有優(yōu)缺點,適用于不同的場景,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2026-04-04
  • Golang中panic的異常處理

    Golang中panic的異常處理

    本文主要介紹了Golang中panic的異常處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Go 1.22中的for循環(huán)新特性詳解

    Go 1.22中的for循環(huán)新特性詳解

    在 Go 語言中,for 循環(huán)是實現(xiàn)迭代的主要方式,Go 中的 for 循環(huán)非常靈活,有多種使用方式,本文將給大家詳細(xì)的介紹一下Go 1.22中的for循環(huán)新特性,感興趣的朋友可以參考下
    2024-02-02
  • Go語言使用Timeout Context取消任務(wù)的實現(xiàn)

    Go語言使用Timeout Context取消任務(wù)的實現(xiàn)

    本文主要介紹了Go語言使用Timeout Context取消任務(wù)的實現(xiàn),包括基本的任務(wù)取消和控制HTTP客戶端請求的超時,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • GO日志打印如何添加goroutineid

    GO日志打印如何添加goroutineid

    今天想給日志添加一個前綴,以區(qū)分不同goroutine的日志,方便做并發(fā)問題的排查,做日志跟蹤,下面給大家分享GO日志打印如何添加goroutineid,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Go語言中的錯誤處理最佳實踐詳解

    Go語言中的錯誤處理最佳實踐詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言中的錯誤處理的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入了解Go語言有一定的幫助,需要的可以參考下
    2023-08-08
  • go實現(xiàn)冒泡排序算法

    go實現(xiàn)冒泡排序算法

    冒泡排序算法是數(shù)據(jù)結(jié)構(gòu)中常用的一種算法,本文就介紹了go實現(xiàn)冒泡排序算法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • golang flag簡單用法

    golang flag簡單用法

    本篇文章介紹了golang flag包的一個簡單的用法,希望通過一個簡單的實例,能讓大家了解它的用法,從中獲得啟發(fā)
    2018-09-09
  • 一文探索Go語言中的內(nèi)存對齊

    一文探索Go語言中的內(nèi)存對齊

    在 Go 語言中,內(nèi)存對齊是一個經(jīng)常被忽略但非常重要的概念,本文將通過一個簡單的例子來探討 Go 語言中的內(nèi)存對齊機制,感興趣的可以了解下
    2024-11-11

最新評論

定远县| 柳河县| 平度市| 万载县| 郓城县| 白水县| 淮阳县| 凤城市| 广元市| 轮台县| 太康县| 贺州市| 中阳县| 安徽省| 镇远县| 阿荣旗| 宿松县| 江陵县| 小金县| 堆龙德庆县| 南溪县| 攀枝花市| 黄龙县| 图片| 朝阳市| 昌乐县| 永顺县| 金沙县| 迭部县| 通辽市| 房产| 新平| 云安县| 葫芦岛市| 九寨沟县| 伊川县| 宁海县| 玛沁县| 嵊泗县| 双江| 姜堰市|