国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

盤點一下結(jié)構(gòu)體標(biāo)簽在 Go 中的應(yīng)用

開發(fā) 后端
掌握了Go語言的朋友們應(yīng)該都知道,在Go的結(jié)構(gòu)體類型聲明里面,字段聲明后可以跟一個可選的字符串標(biāo)簽。

[[432717]]

掌握了Go語言的朋友們應(yīng)該都知道,在Go的結(jié)構(gòu)體類型聲明里面,字段聲明后可以跟一個可選的字符串標(biāo)簽。

  1. type User struct { 
  2.  
  3. Name string `json:"name"
  4.  

上面是一個標(biāo)準(zhǔn)的例子,Name字段聲明中指定了標(biāo)簽json:"name" xml:"name" ,這個標(biāo)簽值看著有點類似Java程序里給類屬性加的注解。

那么這些結(jié)構(gòu)體標(biāo)簽有什么用途呢,我們隨便寫管用嗎?我們平時工作中常用的結(jié)構(gòu)體標(biāo)簽有哪些呢?我們能不能自己定義結(jié)構(gòu)體標(biāo)簽?今天就帶大家掰扯清楚這些問題!

結(jié)構(gòu)體標(biāo)簽

Go語言允許我們通過結(jié)構(gòu)體字段標(biāo)簽給一個字段附加可以被反射獲取的”元信息“,正好我們上篇文章實戰(zhàn)演示Go反射的使用方法和應(yīng)用場景中講了Go語言反射使用方法相關(guān)的內(nèi)容,對反射不清楚的可以先去再復(fù)習(xí)一下。

通常情況下,結(jié)構(gòu)體標(biāo)簽被用于提供結(jié)構(gòu)體字段如何被編碼為或者解碼自另外一種格式的轉(zhuǎn)換信息(或者是以何種形式被保存至/獲取自數(shù)據(jù)庫)。不過,你也可以用它存儲任何你想要設(shè)置的”元信息“,供其他包或者自己使用。

使用規(guī)范

結(jié)構(gòu)體標(biāo)簽在使用上通常是遵守下面三個規(guī)范。

結(jié)構(gòu)體標(biāo)簽字符串的值是一個由空格分隔的 key:"value" 對列表,例如:

  1. type User struct { 
  2.     Name string `json:"name" xml:"name"

鍵,通常表示后面跟的“值”是被哪個包使用的,例如json這個鍵會被encoding/json包處理使用。如果要在“鍵”對應(yīng)的“值”中傳遞多個信息,通常通過用逗號(',')分隔來指定,例如

  1. Name string `json:"name,omitempty"

按照慣例,如果一個字段的結(jié)構(gòu)體標(biāo)簽里某個鍵的“值”被設(shè)置成了的破折號 ('-'),那么就意味著告訴處理該結(jié)構(gòu)體標(biāo)簽鍵值的進(jìn)程排除該字段。例如,把一個字段的標(biāo)簽設(shè)置成下面這樣

  1. Name string `json:"-"

就以為進(jìn)行JSON編碼/解碼時忽略Name這個字段。

怎么獲取到結(jié)構(gòu)體標(biāo)簽

從一開始我們就說結(jié)構(gòu)體標(biāo)簽是給反射準(zhǔn)備的,那么怎么在Go程序里用反射獲得到字段的結(jié)構(gòu)體標(biāo)簽?zāi)?看了我們上一篇文章的同學(xué),應(yīng)該會知道,結(jié)構(gòu)體字段類型相關(guān)的信息,在反射的世界里使用reflect.StructFiled這個類型表示的。

  1. type StructField struct { 
  2.  Name string 
  3.  Type      Type      // field type 
  4.  Tag       StructTag // field tag string 
  5.   ...... 

如上所示,其中包含的Tag字段即代表了字段聲明中的結(jié)構(gòu)體標(biāo)簽信息。讓我們通過自定義結(jié)構(gòu)體標(biāo)簽的例子來演示一下怎么使用它在反射里讀取到標(biāo)簽里的信息。

用反射獲取到自定義的結(jié)構(gòu)體標(biāo)簽

使用反射reflect包訪問結(jié)構(gòu)體字段的標(biāo)簽值,我們需要先獲取到結(jié)構(gòu)體的類型信息Type,然后使用Type.Field(i int) 或 Type.FieldByName(name string),方法查詢字段信息,這兩個方法都會返回一個StructField類型的值,上面我們也說了它在反射的世界里用于描述一個結(jié)構(gòu)體字段;而StructField.Tag 是一個StructTag 類型的值,它描述了字段的標(biāo)簽。

上面我們談到了結(jié)構(gòu)體標(biāo)簽的使用規(guī)范,如果遵循規(guī)范給字段設(shè)置了標(biāo)簽后,就可以使用StructTag的Get方法解析標(biāo)簽的值并返回你指定的鍵的“值”。

  1. func (tag StructTag) Get(key string) string 

為了方便判斷一個給定的key是否存在與標(biāo)簽中,StructTag還提供了一個Lookup方法

  1. func (tag StructTag) Lookup(key string) (value string, ok bool) 

跟Get方法不同的是,Lookup會通過返回的ok值告知給定key是否存在與標(biāo)簽中。

下面通過一個例子,演示下獲取我們自定義標(biāo)簽的過程。

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "reflect" 
  6.  
  7. type User struct { 
  8.  Name  string `mytag:"MyName"
  9.  Email string `mytag:"MyEmail"
  10.  
  11.  
  12.  
  13. func main() { 
  14.  u := User{"Bob""bob@mycompany.com"
  15.  t := reflect.TypeOf(u) 
  16.  
  17.  for i := 0; i < t.NumField(); i++ { 
  18.   field := t.Field(i) 
  19.   fmt.Printf("Field: User.%s\n", field.Name
  20.   fmt.Printf("\tWhole tag value : %s\n", field.Tag) 
  21.   fmt.Printf("\tValue of 'mytag': %s\n", field.Tag.Get("mytag")) 
  22.  } 

上面的程序會輸出

  1. Field: User.Name 
  2.         Whole tag value : mytag:"MyName" 
  3.         Value of 'mytag': MyName 
  4. Field: User.Email 
  5.         Whole tag value : mytag:"MyEmail" 
  6.         Value of 'mytag': MyEmail 

常用的結(jié)構(gòu)體標(biāo)簽鍵

常用的結(jié)構(gòu)體標(biāo)簽Key,指的是那些被一些常用的開源包聲明使用的結(jié)構(gòu)體標(biāo)簽鍵。在這里總結(jié)了一些,都是一些我們平時會用到的包,它們是:

  • json: 由encoding/json 包使用,詳見json.Marshal()的使用方法和實現(xiàn)邏輯。
  • xml : 由encoding/xml包使用,詳見xml.Marshal()。
  • bson: 由gobson包,和mongo-go包使用。
  • protobuf: 由github.com/golang/protobuf/proto 使用,在包文檔中有詳細(xì)說明。
  • yaml: 由gopkg.in/yaml.v2 包使用,詳見yaml.Marshal()。
  • gorm: 由gorm.io/gorm包使用,示例可以在GORM的文檔中找到。

當(dāng)然這里列的就是最常用的幾個庫他們提供給我們使用的結(jié)構(gòu)體標(biāo)簽,歡迎大伙踴躍留言,補充一些自己平時用過的庫提供給開發(fā)者使用的結(jié)構(gòu)體標(biāo)簽。

總結(jié)

 

這篇文章算是我們上一篇講Go反射的一個實踐方向的延伸介紹,如果你也想在自己的包里提供一些結(jié)構(gòu)體標(biāo)簽鍵,讓自己的包更易用些,除了看咱們這篇文章外,還可以去看看上面咱們介紹的幾個類庫,看它們的源碼里是怎么應(yīng)用的,現(xiàn)學(xué)現(xiàn)用!

 

責(zé)任編輯:武曉燕 來源: 網(wǎng)管叨bi叨
相關(guān)推薦

2009-07-10 21:14:53

綜合布線標(biāo)簽

2021-12-20 07:59:07

Go語言結(jié)構(gòu)體

2023-06-09 08:16:09

GolangStruct Tag

2024-10-16 09:57:52

空結(jié)構(gòu)體map屬性

2023-11-21 08:03:43

語言架構(gòu)偏移量

2020-12-02 09:10:22

Go結(jié)構(gòu)數(shù)據(jù)類型

2019-05-31 08:52:53

存儲技術(shù)容器

2021-04-20 09:00:48

Go 語言結(jié)構(gòu)體type

2023-07-29 15:03:29

2021-12-21 08:51:13

Go數(shù)據(jù)Model

2021-05-31 06:00:55

Python 3.4枚舉開發(fā)

2022-11-28 11:45:30

Go應(yīng)用場景

2021-11-02 12:19:18

Go函數(shù)結(jié)構(gòu)

2012-07-22 15:49:25

Java

2020-11-23 08:54:14

Go語言結(jié)構(gòu)體

2020-12-02 08:45:36

Go語言

2020-11-30 06:17:03

Go語言

2020-11-26 06:40:24

Go語言基礎(chǔ)

2021-03-19 08:16:03

數(shù)據(jù)庫

2024-10-12 12:30:18

點贊
收藏

51CTO技術(shù)棧公眾號

亚洲欧美自拍另类日韩| ccyy激情综合| 中文字幕一区二区三区av| 欧美二区在线| 亚洲老司机av| 宅男视频免费在线观看视频| 久久婷婷成人综合色| 日日夜夜精品网站| 亚洲人体偷拍| 国产精品日韩欧美一区二区| 久久亚洲在线| 国产精品人成电影在线观看| 日韩高清三区| 韩国三级电影久久久久久| 先锋影音网一区二区| 国产一区二区三区在线视频| av在线小说| 亚洲欧美网站| 91亚洲一区精品| 欧美成人免费| 天堂成人免费av电影一区| 国产精品网址在线| 国产亚洲一区二区三区啪| 欧洲成人性视频| 日韩成人午夜| 日韩av片电影专区| 欧美精品一区二区久久| 色老综合老女人久久久| 992tv在线观看免费进| 亚洲国产精品久久久久婷婷884 | 国产精品国产精品国产专区蜜臀ah | 大奶在线精品| 高清欧美性猛交| 高清日韩欧美| 国产成人一区二区在线| 欧美成人激情| 精品无人区一区二区三区 | 97精品国产91久久久久久| 懂色av一区二区| 66m—66摸成人免费视频| 开心激情综合| 国产精品丝袜一区二区三区| 亚洲成人一区在线| 久久手机免费观看| 日韩欧美国产一区二区| 美女免费免费看网站| 婷婷成人激情在线网| 又黄又爽在线免费观看| 日韩av免费在线看| 色狠狠久久av综合| 性欧美大战久久久久久久久| 一级黄色在线| 影视一区二区| 亚洲大胆人体av| 偷拍视频一区二区三区| 欧美乱妇40p| 国产精品中文字幕在线| 一区二区久久| 国产成人一二三区| 亚洲欧美自拍偷拍色图| 免费在线性爱视频| 日韩精品久久久久| 午夜视频在线观看精品中文| 国产免费一区二区三区在线能观看| 精品成人国产| 三年中文高清在线观看第6集| 国产无人区一区二区三区| 中国国产一级毛片| 日韩午夜电影在线观看| 亚洲精品国产九九九| 欧美日韩aaa| 在线看片福利| 国产精品成人av在线| 石原莉奈在线亚洲二区| 97公开免费视频| 欧美日韩亚洲视频| 精品裸体bbb| 91亚洲精品久久久| 国产精品一区二区91| 在线看片免费人成视久网| 一个人www欧美| 亚洲澳门在线| 激情内射人妻1区2区3区| 欧美浪妇xxxx高跟鞋交| 欧美顶级毛片在线播放| 日韩欧美精品在线不卡| 国产精品久久久久精k8| 污视频免费在线观看| 78m国产成人精品视频| 人人精品人人爱| 蜜臀一区二区三区| 久久精品国产亚洲精品| 亚洲免费激情| 男女羞羞视频网站| 亚洲欧洲高清在线| 伊人久久婷婷| 濑亚美莉一二区在线视频 | 欧美成人一区二区| 欧美亚洲国产精品久久| 久久国产午夜精品理论片最新版本| 色综合久久中文综合久久牛| 国产伊人久久| 亚洲草草视频| 欧美主播一区二区三区| 亚洲电影一级片| 欧美成人xxxxx| 日韩精品免费在线播放| 日韩视频一区| 在线观看理论片| 亚洲91精品在线观看| 国产丶欧美丶日本不卡视频| 二区三区在线观看| 成人性教育视频在线观看| 久久精品欧美一区二区三区不卡| 91吃瓜在线观看| 玖玖玖精品中文字幕| 欧美性猛交xxxx偷拍洗澡| 色爱av综合网| 日韩欧美黄色大片| 色综合伊人色综合网| 男女视频一区二区| 成人直播在线| 国内精品久久久久久久果冻传媒| 亚洲一区二区在线观看视频 | 婷婷综合视频| 免费高清特黄a大片| 久久男人的天堂| 久久一区二区三区四区| 桃色一区二区| 女人帮男人橹视频播放| 亚洲视频在线免费看| 精品亚洲成a人在线观看 | 中文字幕中文字幕在线中一区高清| 欧美日韩国产精品成人| 黄色一级二级三级| 国产一区二区动漫| 久久99久久久欧美国产| 国产精品vvv| 99中文字幕在线观看| 亚洲区在线播放| 99久久久无码国产精品| 久久99成人| 五月婷婷导航| 国产精品精品久久久久久| 亚洲精品乱码久久久久久| 精品影片在线观看的网站| aaa级精品久久久国产片| 欧美日韩一区免费| 婷婷久久国产对白刺激五月99| 97影视大全免费追剧大全在线观看| 国产成人极品视频| 午夜精彩视频在线观看不卡| 91九色精品| 欧美日韩xx| 亚洲国产精品久久久久久女王| 亚洲精品videossex少妇| 国产精品一区2区| 精品一区二区三区中文字幕在线 | 在线看片不卡| 69久久精品| 亚洲免费av网| 美女视频久久黄| 一级特黄大欧美久久久| 韩国在线视频一区| 两个人看的在线视频www| 国产男女激情视频| 国产精品中文在线| 日韩情涩欧美日韩视频| 成人精品高清在线| 国产精品亚洲二区| 日本中文字幕伦在线观看| 久久精品国产精品亚洲| 国产精品福利电影一区二区三区四区 | 99精彩视频| 亚洲精品v天堂中文字幕| 久久久久九九视频| 色乱码一区二区三区网站| www在线观看播放免费视频日本| 日本丰满大乳奶| 欧美中文字幕在线观看| 欧美性受xxxx黑人xyx| 国产在线精品一区二区三区不卡| 一区二区三区四区高清视频| 精品视频二区| 日日碰狠狠添天天爽超碰97| 91精品久久久久久久久久另类| 亚洲电影第1页| 亚洲免费在线电影| 欧美a级理论片| 亚洲区小说区图片区qvod| 国产最新在线| 日本xxxx黄色| 天天综合狠狠精品| 国产成人精品免费久久久久| 亚洲精品91美女久久久久久久| 中文字幕亚洲在| 蜜臀精品久久久久久蜜臀| 精品一区欧美| 欧美××××黑人××性爽 | 一区二区三区中文在线|