精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 語言中結構體打 Tag 是什么意思?

開發 后端
哈嘍,大家好,我是asong。今天想與大家分享Go語言中結構體標簽是怎么使用的,以及怎樣定制自己的結構體標簽解析。

[[434972]]

前言

哈嘍,大家好,我是asong。今天想與大家分享Go語言中結構體標簽是怎么使用的,以及怎樣定制自己的結構體標簽解析。

大多數初學者在看公司的項目代碼時,看到的一些結構體定義會是這樣的:

  1. type Location struct { 
  2.  Longitude float32 `json:"lon,omitempty"
  3.  Latitude  float32 `json:"lat,omitempty"

字段后面會有一個標簽,這個標簽有什么用呢?

上面的例子中,標簽json:"lon,omitempty"代表的意思是結構體字段的值編碼為json對象時,每一個導出字段變成該對象的一個成員,這個成員的名字為lon或者lat,并且當字段是空值時,不導出該字段;總結就是lon、lat是重命名成員的名字,omitempty用來決定成員是否導出。

看到這里,有一些朋友可能會好奇,這個你是怎么知道這樣使用的呢?我可以隨便寫標簽嗎?

接下來我們就一點點來揭秘,開車!!!

什么是標簽

Go語言提供了可通過反射發現的的結構體標簽,這些在標準庫json/xml中得到了廣泛的使用,orm框架也支持了結構體標簽,上面那個例子的使用就是因為encoding/json支持了結構體標簽,不過他有自己的標簽規則;但是他們都有一個總體規則,這個規則是不能更改的,具體格式如下:

  1. `key1:"value1" key2:"value2" key3:"value3"...` // 鍵值對用空格分隔 

結構體標簽可以有多個鍵值對,鍵與值要用冒號分隔,值要使用雙引號括起來,多個鍵值對之間要使用一個空格分隔,千萬不要使用逗號!!!

如果我們想要在一個值中傳遞多個信息怎么辦?不同庫中實現的是不一樣的,在encoding/json中,多值使用逗號分隔:

  1. `json:"lon,omitempty"

在gorm中,多值使用分號分隔:

  1. `gorm:"column:id;primaryKey" 

具體使用什么符號分隔需要大家要看各自庫的文檔獲取。

結構體標簽是在編譯階段就和成員進行關聯的,以字符串的形式進行關聯,在運行階段可以通過反射讀取出來。

現在大家已經知道什么是結構體標簽了,規則還是很規范的,但是很容易出錯,因為Go語言在編譯階段并不會對其格式做合法鍵值對的檢查,這樣我們不小心寫錯了,就很難被發現,不過我們有go vet工具做檢查,具體使用來看一個例子:

  1. type User struct { 
  2.  Name string `abc def ghk` 
  3.  Age uint16 `123: 232` 
  4. func main()  { 

然后執行go vet main.go,得出執行結果:

  1. # command-line-arguments 
  2. go_vet_tag/main.go:4:2: struct field tag `abc def ghk` not compatible with reflect.StructTag.Get: bad syntax for struct tag pair 
  3. go_vet_tag/main.go:5:2: struct field tag `123: 232` not compatible with reflect.StructTag.Get: bad syntax for struct tag value 

bad syntax for struct tag pair告訴我們鍵值對語法錯誤,bad syntax for struct tag value值語法錯誤。

所以在我們項目中引入go vet作為CI檢查是很有必要的。

標簽使用場景

Go官方已經幫忙整理了哪些庫已經支持了struct tag:https://github.com/golang/go/wiki/Well-known-struct-tags。

Tag Documentation
xml https://godoc.org/encoding/xml
json https://godoc.org/encoding/json
asn1 https://godoc.org/encoding/asn1
reform https://godoc.org/gopkg.in/reform.v1
dynamodb https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/dynamodbattribute/#Marshal
bigquery https://godoc.org/cloud.google.com/go/bigquery
datastore https://godoc.org/cloud.google.com/go/datastore
spanner https://godoc.org/cloud.google.com/go/spanner
bson https://godoc.org/labix.org/v2/mgo/bson, https://godoc.org/go.mongodb.org/mongo-driver/bson/bsoncodec
gorm https://godoc.org/github.com/jinzhu/gorm
yaml https://godoc.org/gopkg.in/yaml.v2
toml https://godoc.org/github.com/pelletier/go-toml
validate https://github.com/go-playground/validator
mapstructure https://godoc.org/github.com/mitchellh/mapstructure
parser https://godoc.org/github.com/alecthomas/participle
protobuf https://github.com/golang/protobuf
db https://github.com/jmoiron/sqlx
url https://github.com/google/go-querystring
feature https://github.com/nikolaydubina/go-featureprocessing

像json、yaml、gorm、validate、mapstructure、protobuf這幾個庫的結構體標簽是很常用的,gin框架就集成了validate庫用來做參數校驗,方便了許多,之前寫了一篇關于validate的文章:boss: 這小子還不會使用validator庫進行數據校驗,開了~~~,可以關注一下。

具體這些庫中是怎么使用的,大家可以看官方文檔介紹,寫的都很詳細,具體場景具體使用哈!!!

自定義結構體標簽

現在我們可以回答開頭的一個問題了,結構體標簽是可以隨意寫的,只要符合語法規則,任意寫都可以的,但是一些庫沒有支持該標簽的情況下,隨意寫的標簽是沒有任何意義的,如果想要我們的標簽變得有意義,就需要我們提供解析方法。可以通過反射的方式獲取標簽,所以我們就來看一個例子,如何使用反射獲取到自定義的結構體標簽。

  1. type User struct { 
  2.  Name string `asong:"Username"
  3.  Age  uint16 `asong:"age"
  4.  Password string `asong:"min=6,max=10"
  5. func getTag(u User) { 
  6.  t := reflect.TypeOf(u) 
  7.  
  8.  for i := 0; i < t.NumField(); i++ { 
  9.   field := t.Field(i) 
  10.   tag := field.Tag.Get("asong"
  11.   fmt.Println("get tag is ", tag) 
  12.  } 
  13.  
  14. func main()  { 
  15.  u := User
  16.   Name"asong"
  17.   Age: 5, 
  18.   Password"123456"
  19.  } 
  20.  getTag(u) 

運行結果如下:

  1. get tag is  Username 
  2. get tag is  age 
  3. get tag is  min=6,max=10 

這里我們使用TypeOf方法獲取的結構體類型,然后去遍歷字段,每個字段StructField都有成員變量Tag:

  1. // A StructField describes a single field in a struct. 
  2. type StructField struct { 
  3.  Name string 
  4.  PkgPath string 
  5.  Type      Type      // field type 
  6.  Tag       StructTag // field tag string 
  7.  Offset    uintptr   // offset within struct, in bytes 
  8.  Index     []int     // index sequence for Type.FieldByIndex 
  9.  Anonymous bool      // is an embedded field 

Tag是一個內置類型,提供了Get、Loopup兩種方法來解析標簽中的值并返回指定鍵的值:

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

Get內部也是調用的Lookup方法。區別在于Lookup會通過返回值告知給定key是否存在與標簽中,Get方法完全忽略了這個判斷。

總結

本文主要介紹一下Go語言中的結構體標簽是什么,以及如何使用反射獲取到解結構體標簽,在日常開發中我們更多的是使用一些庫提供好的標簽,很少自己開發使用,不過大家有興趣的話可以讀一下validae的源碼,看看他是如何解析結構體中的tag,也可以自己動手實現一個校驗庫,當作練手項目。

 

文中代碼已上傳github:https://github.com/asong2020/Golang_Dream/tree/master/code_demo/struct_tag_demo

 

責任編輯:武曉燕 來源: Golang夢工廠
相關推薦

2023-07-29 15:03:29

2023-01-12 08:52:50

GoroutinesGo語言

2020-10-14 07:50:57

DNS劫持

2021-04-20 09:00:48

Go 語言結構體type

2020-07-21 15:20:20

語言結構體共用體

2025-08-15 06:30:18

2018-10-08 15:42:37

VoLTE4G流量語音

2020-11-26 06:40:24

Go語言基礎

2020-11-30 06:17:03

Go語言

2020-12-02 08:45:36

Go語言

2022-08-26 09:51:49

索引簽名編程語言

2020-11-23 08:54:14

Go語言結構體

2021-01-21 21:24:34

DevOps開發工具

2010-08-25 10:28:05

margin

2010-09-26 10:29:45

JVMJava虛擬機

2010-09-09 09:23:42

CSSDIV

2022-09-18 23:09:13

Go語言標準庫

2020-12-02 09:10:22

Go結構數據類型

2024-03-29 09:12:43

Go語言工具

2014-07-28 08:28:38

Windows
點贊
收藏

51CTO技術棧公眾號

伊人久久综合影院| 91在线三级| 久久成人免费日本黄色| 欧美成人免费播放| 亚洲天堂av网站| 免费看男女www网站入口在线| 久久综合狠狠综合久久激情| 国产美女久久精品香蕉69| 亚洲国产成人精品综合99| 高清一区二区三区| 欧美日产在线观看| 热99这里只有精品| 成人综合影院| 国产寡妇亲子伦一区二区| 久久青草精品视频免费观看| 怡红院一区二区三区| 91精品啪在线观看国产手机| 欧美在线制服丝袜| 精品国产一区二区三区无码| 福利视频在线播放| av一二三不卡影片| 国产综合香蕉五月婷在线| 中文字幕超碰在线| 欧美91视频| 中文字幕久热精品在线视频| 亚洲av成人无码一二三在线观看| 91精品国产一区二区在线观看| 狠狠色狠狠色综合日日五| 2022中文字幕| 尤物网址在线观看| 久久综合久久99| 国产精品一区二区三区不卡| 国产乱人乱偷精品视频| 另类激情亚洲| 欧美激情网友自拍| 国产黄色录像片| 精品在线观看入口| 欧美精品一区二区三区一线天视频| 91激情视频在线| 黄页网站在线观看免费| 亚洲欧美日韩国产综合在线| 亚洲欧洲精品在线观看| 国产精品国产高清国产| 处破女av一区二区| 亚洲伊人成综合成人网| 91九色蝌蚪91por成人| 日韩vs国产vs欧美| 国产91色在线|| 日本一区二区三区精品| 国产日韩欧美一区| 97免费在线视频| 久久久.www| 国产精品大片免费观看| 欧美日本黄视频| 少妇久久久久久被弄高潮| 一区二区中文| 欧美成人免费va影院高清| 青青草原在线免费观看视频| 一区二区三区在线电影| 欧美日本啪啪无遮挡网站| 亚洲国产美女视频| 欧美激情亚洲| 欧美激情国产日韩精品一区18| 日本a级片视频| 欧美日韩18| 欧美激情中文网| 五月天婷婷网站| 亚洲深夜av| 日本午夜人人精品| 精品视频一二三区| 麻豆传媒一区二区三区| 91免费欧美精品| 亚洲大尺度网站| 成人午夜碰碰视频| 老司机精品福利在线观看| 日韩午夜影院| 国产精品久久久久久久久免费桃花 | 欧美xxxxhdvideosex| 亚洲一二三区在线观看| 无码专区aaaaaa免费视频| 成人欧美大片| 欧美日韩不卡在线| 欧美日韩一区二区区| 女同另类激情重口| 亚洲天堂成人在线| 乱h高h女3p含苞待放| 雨宫琴音一区二区在线| 日韩av电影手机在线观看| 91激情在线观看| 成人av午夜电影| 欧美综合色免费| 黄色片视频在线免费观看| 欧美国产大片| 91麻豆精品国产91久久久久久| 国产成人精品综合久久久久99| 日韩中出av| 日韩视频第一页| 精品成人久久久| 美女网站色91| 国产精品加勒比| 成人免费高清在线播放| 一区二区三区日韩精品视频| 午夜精品久久久久久久无码| 久久久久毛片| 亚洲激情视频在线| 91香蕉视频污在线观看| 亚洲人成在线影院| 国产专区精品视频| 久久免费看视频| 亚洲精品伦理在线| 黄色三级视频在线| 国产欧美三级电影| 久久亚洲精品网站| www.久久视频| www.日本不卡| 自拍视频一区二区三区| 大胆人体一区二区| 精品国产一区a| 日本激情视频一区二区三区| 久久一区中文字幕| 国产精品久久久久av福利动漫| 91社区在线观看| 色综合天天做天天爱| 免费在线观看日韩av| 日韩综合一区| 欧美中文在线观看国产| 亚洲精品一区二区三区蜜桃| 国产精品麻豆欧美日韩ww| www黄色日本| 成人午夜网址| 久久6免费高清热精品| 亚洲综合精品国产一区二区三区| 久久久一区二区三区| 日本a在线免费观看| 欧美三级一区| 久久av资源网站| 亚洲天天综合网| 国产精品乱码一区二区三区软件 | 亚洲综合三区| 成人av免费电影| www视频在线看| 69堂精品视频| 久久福利免费视频| 日本午夜一区二区| 日本不卡在线播放| 香蕉成人av| 亚洲精品资源美女情侣酒店| 亚洲AV无码成人精品区东京热| 成人一区在线看| 日本国产中文字幕| 91成人午夜| 国模视频一区二区| 日本激情视频网站| 婷婷成人激情在线网| 又黄又爽的网站| 99视频在线精品国自产拍免费观看| 国产精品视频在线免费观看| 91超碰在线免费| 亚洲精品国产欧美| www亚洲视频| 久久久精品国产免费观看同学| 亚洲午夜精品久久久久久人妖| 欧美成人基地| 青青草一区二区| 国产在线超碰| 欧美日韩国产另类一区| 国产一区二区播放| 国产ts人妖一区二区| 农民人伦一区二区三区| 欧美变态挠脚心| 国产精品精品视频| 成人看片免费| 亚洲福利视频久久| 日韩黄色片网站| 亚洲人成在线播放网站岛国| 色哟哟在线观看视频| 亚洲另类自拍| 亚洲国产精品综合| 四虎国产精品免费久久| 欧美激情第1页| 加勒比一区二区三区在线| 欧美日韩精品欧美日韩精品一综合| 视频国产一区二区| 成人午夜精品在线| av五月天在线| 欧美日韩 国产精品| 欧美日韩国产精品一卡| 亚洲国产aⅴ精品一区二区三区| 欧美激情videoshd| 成人免费一区二区三区视频网站| 日韩免费看网站| 四虎精品永久在线| 亚洲欧洲综合另类| 国产在线观看无码免费视频| 精品一区二区三区久久| 免费无码毛片一区二三区| 精品一区二区三区中文字幕老牛| 97超碰资源| 亚洲天堂一区二区| 久久久久久国产| av电影在线观看一区二区三区| 精品少妇一区二区三区日产乱码| 中文字幕一区二区人妻视频| 亚洲乱码中文字幕综合| 中日韩精品一区二区三区 | 国产这里只有精品| 97天天综合网| 久久国产精品久久久| 深夜福利视频在线免费观看| 欧美天天综合网| 日本一级淫片免费放| 日韩美女视频19| 久久av无码精品人妻系列试探| 国产激情精品久久久第一区二区| 婷婷丁香激情网| 国产一区二区三区的电影| 日本一级淫片演员| 欧美午夜精彩| 久久超碰亚洲| 国产 日韩 欧美 综合 一区| 成人午夜在线观看| 成人影院在线免费观看| 日本免费在线精品| 黄在线观看免费网站ktv| 欧美成人高清视频| 麻豆电影在线播放| 中文一区二区视频| 国产精品视频一区二区久久| 日韩电视剧在线观看免费网站| 国产高潮在线观看| 91麻豆精品国产综合久久久久久| 丰满人妻一区二区三区四区| 日韩欧美在线视频免费观看| 日韩少妇高潮抽搐| 亚洲午夜免费电影| 欧美日韩激情在线观看| 亚洲欧美日韩一区二区| 亚洲精品卡一卡二| 国产精品精品国产色婷婷| 日韩在线免费观看av| 91美女福利视频| 日韩Av无码精品| 成人动漫在线一区| 精品1卡二卡三卡四卡老狼| 国产精品小仙女| 国产资源中文字幕| 国产乱理伦片在线观看夜一区| 亚洲第一色av| 国产在线麻豆精品观看| 图片区乱熟图片区亚洲| 国内精品伊人久久久久av影院 | 国产在线观看免费一区| 精品黑人一区二区三区久久| 日本熟伦人妇xxxx| 午夜精品福利一区二区三区av| 久久精品欧美一区二区| 亚洲国产精品久久人人爱蜜臀| 久久精品这里只有精品| 午夜精彩视频在线观看不卡| 在线观看日韩中文字幕| 精品福利在线观看| 国产成人精品777777| 欧美性色aⅴ视频一区日韩精品| 中文字幕第99页| 欧美高清视频一二三区| a天堂视频在线| 精品精品国产高清一毛片一天堂| 午夜视频在线播放| 影音先锋日韩有码| 久久久久久久久免费视频| 欧美成人三级视频网站| 国产精品vvv| 国产精品第2页| 成人在线精品| 国产欧美精品一区二区三区| 久久av资源| 天堂v在线视频| 激情欧美日韩| 日韩av黄色网址| 久久国产精品免费| 亚洲熟女乱综合一区二区| 暴力调教一区二区三区| 成人无码av片在线观看| 一区二区三区资源| 六月丁香婷婷综合| 日韩一区二区在线免费观看| 四虎精品一区二区三区| 日韩中文在线中文网在线观看| av香蕉成人| 国产91色在线|免| 精品欧美视频| 日本高清一区| 欧美激情 亚洲a∨综合| 成人羞羞国产免费网站| 精品一二线国产| asian性开放少妇pics| 国产精品狼人久久影院观看方式| 伊人国产在线观看| 欧美色视频在线| 色哟哟国产精品色哟哟| 色妞色视频一区二区三区四区| 丁香花在线电影小说观看| 国产精品777| 巨人精品**| 丰满女人性猛交| 国产精品一区二区av白丝下载 | 亚洲精品中文字幕无码蜜桃| 国产一区二区免费看| 国产精品久久久久无码av色戒| 亚洲女同一区二区| 懂色av蜜臀av粉嫩av喷吹| 亚洲精品在线一区二区| 欧美黑人激情| 日本aⅴ大伊香蕉精品视频| 免费欧美网站| 亚洲精品一卡二卡三卡四卡| 亚洲深夜av| 韩国av中国字幕| 亚洲色图制服丝袜| 中文字幕欧美人妻精品一区蜜臀| 精品88久久久久88久久久| 91高清在线观看视频| 国产精品久久久| 中日韩免视频上线全都免费| 无码日本精品xxxxxxxxx| 国模大尺度一区二区三区| 日韩毛片无码永久免费看| 欧美日韩一区二区三区| 女人18毛片水真多18精品| 麻豆一区二区在线观看| 欧美日韩视频免费看| 一区二区三区四区国产精品| 中文字幕网址在线| 夜夜嗨av一区二区三区四区| 最近高清中文在线字幕在线观看1| 成人黄色片视频网站| 影视亚洲一区二区三区| 超碰超碰在线观看| 国产精品美日韩| 波多野结衣视频在线观看| 亚洲欧美国产另类| 成人欧美大片| 日本不卡在线观看| 日韩成人dvd| 亚洲色图 激情小说| 在线一区二区三区做爰视频网站| 青春有你2免费观看完整版在线播放高清 | 丰满肥臀噗嗤啊x99av| 萌白酱国产一区二区| 激情综合五月| 成年人深夜视频| 国产91在线观看丝袜| 久草国产在线观看| 精品91自产拍在线观看一区| 蜜臀久久精品| 裸模一区二区三区免费| 国产www.大片在线| 欧美精品在线网站| 这里视频有精品| av日韩一区二区三区| 97精品久久久久中文字幕| 天天操天天干视频| 亚洲天天在线日亚洲洲精| 福利一区二区免费视频| eeuss中文| 国产91精品久久久久久久网曝门| 五月天综合在线| 亚洲男人av电影| 开心久久婷婷综合中文字幕| 欧美一级免费在线观看| 成人夜色视频网站在线观看| 精品国产一区二区三区四| 一级做a爰片久久毛片美女图片| 综合久久av| 免费特级黄色片| 久久久国产综合精品女国产盗摄| 久久久久亚洲av无码专区体验| 亚洲国产美女久久久久| 日韩欧美一区二区三区免费观看| 伊人婷婷久久| 波多野结衣中文字幕一区| 无码人妻丰满熟妇奶水区码| 日韩在线视频导航| 国产精品对白久久久久粗| 精品久久久噜噜噜噜久久图片| 亚洲天堂精品在线观看| 少妇人妻一区二区| 国产美女91呻吟求| 日韩午夜免费视频| 国产又粗又黄又猛| 精品久久人人做人人爰| 精品三区视频| 大荫蒂性生交片| 日本一区免费视频| 亚洲精品第五页| 国产精选久久久久久| 精品成人一区| 老司机深夜福利网站| 日韩精品在线观看一区| 国产一区二区三区亚洲综合 |