精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲综合五月| 天堂√中文最新版在线| 狠狠色2019综合网| 日韩一区视频在线| 中文字幕一二三区| 爱啪啪综合导航| 久久婷婷成人综合色| 国产成人欧美在线观看| 亚洲人与黑人屁股眼交| 91蝌蚪精品视频| 天天综合色天天综合色h| 51成人做爰www免费看网站| 国产亚洲精品码| 免费久久精品| 91精品国产入口在线| 欧美精品自拍视频| 国产高清av在线| 久久99久久99| 国模精品系列视频| 在线小视频你懂的| 成人亚洲综合| 性做久久久久久久久| 婷婷精品国产一区二区三区日韩| 中文字幕一区二区三区四区免费看 | 国产精品国产精品国产专区不蜜 | 97超碰人人爱| 国产wwwxxx| 麻豆91精品| 欧美www在线| 人妻大战黑人白浆狂泄| 日韩欧美专区| 欧美性xxxxxx| www婷婷av久久久影片| 国产三级在线免费| 成人晚上爱看视频| 成人在线播放av| 久久99国产综合精品免费| 日本高清免费电影一区| 日韩成人av网址| 日本一二三区在线| 国产精品原创视频| 天天影视涩香欲综合网| 香蕉视频在线网址| jizzjizz在线观看| 久久综合色一综合色88| yellow视频在线观看一区二区 | 亚洲 自拍 另类 欧美 丝袜| 日韩天堂在线| 精品久久久久久国产91| 中文字幕一区二区三区色视频| 国产精品久久久久久婷婷天堂| av大全在线观看| 在线视频日韩| 4388成人网| 久久国产黄色片| 先锋a资源在线看亚洲| 欧美亚洲日本网站| 中文字幕一区在线播放| 美女日韩在线中文字幕| 国产999精品久久久影片官网| 天天操天天操天天操天天| 中文一区二区| 日产日韩在线亚洲欧美| av手机天堂网| 久久成人久久爱| 亚洲综合小说区| 亚洲精品国产精品乱码不卡| 国产999精品久久久久久绿帽| 国产精品一区二区三区精品| 头脑特工队2在线播放| 91亚洲精品久久久蜜桃网站| 欧美日产一区二区三区在线观看| 国产最新视频在线观看| 中文字幕免费不卡| 男插女免费视频| 91超碰在线免费| 一本色道久久综合狠狠躁的推荐| 欧美精品aaaa| 欧美日本三级| 亚洲精品永久免费| www.99re6| 欧美日韩一卡| 91国内在线视频| 男操女视频网站| 国产在线精品一区在线观看麻豆| 成人免费在线看片| 可以在线观看的黄色| 国产精品久久午夜| www插插插无码视频网站| 欧美xxxxxx| 91精品国产综合久久精品麻豆| 亚洲乱妇老熟女爽到高潮的片| 婷婷综合成人| 久久视频免费观看| 国产视频91在线| 精品综合久久久久久8888| 国产精品久久久对白| 成人免费高清在线播放| 一区二区三区四区在线播放| 欧美v在线观看| 高清国产一区二区三区四区五区| 日韩电影中文字幕| www.xxxx日本| 日韩av一区二| 国产伦精品一区二区三区视频免费| 国产二区视频在线观看| 亚洲亚洲人成综合网络| 欧美精品久久久久久久久25p| 超碰在线成人| 色偷偷偷综合中文字幕;dd| 日本一级一片免费视频| 黄页网站大全一区二区| 欧美亚洲精品日韩| 成人性生交大片免费看网站| 欧美色涩在线第一页| 三叶草欧洲码在线| 欧美二区不卡| 成人免费网视频| 成人网视频在线观看| 天天av天天翘天天综合网色鬼国产 | 欧美巨大另类极品videosbest | 欧美亚洲第一区| 丰满肉肉bbwwbbww| 自拍视频在线观看一区二区| 国产成人久久777777| 免费福利视频一区| 久久久久久久91| 国产丝袜在线视频| 国产精品精品国产色婷婷| 久久久噜噜噜www成人网| 99精品在免费线中文字幕网站一区 | 欧美熟妇一区二区| 在线成人www免费观看视频| 亚洲精品日韩激情在线电影| 色多多视频在线观看| 欧美这里有精品| 久久久久久久毛片| 久久久久看片| 日韩欧美亚洲v片| 二区三区不卡| 亚洲美女性视频| 91精品国产高清一区二区三密臀| 99国产精品久| 国产精品动漫网站| 亚洲综合图色| 日韩av观看网址| 激情小说 在线视频| 欧美性猛交xxxx乱大交蜜桃| 亚洲少妇18p| 国产欧美一级| 欧美二区在线| 亚洲www啪成人一区二区| 永久555www成人免费| 欧美日韩在线视频播放| 欧美韩国日本一区| 手机免费看av网站| 综合激情网站| 99在线国产| 2021天堂中文幕一二区在线观| 精品国产乱码久久| 日本污视频在线观看| a级精品国产片在线观看| 国产真人做爰毛片视频直播| 国产精品17p| 欧美一乱一性一交一视频| 美丽的姑娘在线观看免费动漫| 欧美又粗又大又爽| 精品无码久久久久成人漫画| 高清不卡一二三区| 国产aaa一级片| 日韩国产专区| 成人日韩av在线| 国产探花视频在线观看| 亚洲毛片在线看| 中文字幕人妻一区二区三区视频| 亚洲欧美国产毛片在线| 秘密基地免费观看完整版中文 | 天天射,天天干| 在线影视一区二区三区| 国产免费美女视频| 成人97人人超碰人人99| 青青草精品视频在线观看| 亚洲欧美在线专区| 精品欧美一区二区久久久伦 | 97超级碰碰| 亚洲电影观看| yw.139尤物在线精品视频| 日韩在线一区二区三区四区| 在线视频国内一区二区| 九九九免费视频| 国产日韩欧美在线一区| 18深夜在线观看免费视频| 丝袜美腿一区二区三区| 四虎4hu永久免费入口| 天堂99x99es久久精品免费| 国产日韩在线播放| 91禁在线看| 久久影院资源网| 日本福利在线观看| 日韩欧美国产wwwww| 亚洲天堂视频在线播放| 亚洲一区二区视频| 国精产品视频一二二区| 91一区在线观看| 少妇高潮一69aⅹ| 免费在线视频一区| 91视频 -- 69xx| 欧美一区综合| 艳色歌舞团一区二区三区| 香蕉久久精品日日躁夜夜躁| 91在线免费观看网站| 少妇精品视频一区二区免费看| 久久久久久97| 18网站在线观看| 色悠悠国产精品| 韩国中文字幕2020精品| 日韩成人久久久| 黄色av免费观看| 日韩免费电影一区| 一区二区三区精| 欧美在线免费播放| 日产欧产va高清| 亚洲伊人色欲综合网| 国产在线观看免费视频软件| 国产视频一区不卡| 草草地址线路①屁屁影院成人| 粉嫩久久99精品久久久久久夜| 在线黄色免费看| 免费精品99久久国产综合精品| 97视频在线免费播放| 国产精品乱看| 国产精品久久中文字幕| 极品中文字幕一区| 亚洲乱码日产精品bd在线观看| 亚洲精品网址| 免费久久久久久| 91精品亚洲| 综合国产精品久久久| 日韩国产一区| 青青草原国产免费| 欧美成人精品一区二区三区在线看| 欧美一级爱爱| 精品色999| 亚洲aⅴ天堂av在线电影软件| 亚洲日产av中文字幕| 久草精品电影| 免费成人高清在线视频theav| 免费久久99精品国产自| 婷婷综合一区| 日韩欧美第二区在线观看| 精品国产91| 香蕉久久夜色| 91精品国产成人观看| 大地资源网在线观看免费官网| 亚洲情侣在线| 毛片在线视频观看| 国产精品啊啊啊| 免费观看美女裸体网站| 国产日本精品| 男人插女人下面免费视频| 日精品一区二区三区| 精品999在线| 国产麻豆视频一区二区| 成熟妇人a片免费看网站| 久久尤物电影视频在线观看| 性欧美精品中出| 国产精品国产精品国产专区不蜜| 性色av无码久久一区二区三区| 亚洲国产精品一区二区久久恐怖片| 国产精品suv一区二区69| 日韩欧美在线视频观看| 在线观看国产黄| 日韩欧美国产不卡| 欧美亚洲日本| 中文字幕亚洲自拍| 性欧美videoshd高清| 欧美在线亚洲在线| 99久久久国产| 好看的日韩精品视频在线| 精品一区电影| 日韩视频 中文字幕| 国产精品久久久久9999高清| 无限资源日本好片| 成人性生交大合| 丁香花五月婷婷| 亚洲综合在线免费观看| 亚洲欧美另类在线视频| 91精品国产91久久综合桃花| 手机看片福利在线| 日韩中文字幕在线观看| av3级在线| 成人免费福利在线| 亚洲精品播放| 国产一级片91| 蜜乳av一区二区| 视频免费在线观看| 国产精品夫妻自拍| 精品成人久久久| 欧美丰满美乳xxx高潮www| 五十路在线视频| 久久艹在线视频| 天堂久久午夜av| 激情五月综合色婷婷一区二区| 久久裸体网站| 日本三级免费观看| 成人网页在线观看| 中文字幕电影av| 色系网站成人免费| 国模无码一区二区三区| 色七七影院综合| 香蕉成人av| 精品视频在线观看| 国精品一区二区三区| 爱爱爱爱免费视频| 久久一区二区三区四区| 精品无码久久久久久久| 在线观看91精品国产麻豆| 青青草在线免费视频| 久久免费视频在线观看| 国产精品3区| 一区在线电影| 奇米精品一区二区三区在线观看| 右手影院亚洲欧美| 亚洲va欧美va国产va天堂影院| 国产av无码专区亚洲a∨毛片| 在线国产精品播放| 色猫猫成人app| 日韩一区二区三区高清| 免费精品视频| 三级黄色片网站| 精品久久香蕉国产线看观看亚洲 | 日韩 欧美 视频| 国产一区二区美女诱惑| 网爆门在线观看| 欧美日韩一区二区欧美激情| 国产乱视频在线观看| 国产z一区二区三区| 亚洲人成网站77777在线观看| 少妇无码av无码专区在线观看| eeuss影院一区二区三区| 日韩欧美视频在线免费观看| 精品久久久久久综合日本欧美| 超碰电影在线播放| 96国产粉嫩美女| 一区二区国产在线| 伊人av在线播放| 亚洲色图19p| 精品国产999久久久免费| 欧美久久精品一级黑人c片| 麻豆久久一区| 黄色激情在线视频| 99久久精品国产网站| www.国产高清| 亚洲欧美日韩图片| www.26天天久久天堂| 在线免费观看成人网| 国产综合久久久久影院| 久久av高潮av无码av喷吹| 亚洲第一区第一页| 黄色亚洲网站| 亚洲国产午夜伦理片大全在线观看网站 | 最新高清无码专区| 国产高清视频免费| 97婷婷涩涩精品一区| 九九在线高清精品视频| 污色网站在线观看| 亚洲免费在线视频| 天堂在线视频网站| 国产精品黄视频| 亚洲一区二区| 国产黑丝在线观看| 色av成人天堂桃色av| 淫片在线观看| 国产精品视频免费一区二区三区| 亚洲人成高清| 丁香激情五月少妇| 日韩欧美国产午夜精品| 成人香蕉视频| 中文一区一区三区免费| 波多野结衣在线aⅴ中文字幕不卡| 亚洲AV无码成人精品区东京热| 日韩中文字幕在线观看| 欧美freesex8一10精品| 久久久精品麻豆| 亚洲一区二区三区中文字幕 | 欧美精品日韩三级| 天海翼亚洲一区二区三区| 久久久久xxxx| 欧美视频一二三| 久操免费在线| 久久九九视频| 国产一区二区三区四区五区美女| 日韩av在线播放观看| 色婷婷综合成人| 人体久久天天| 亚欧美一区二区三区| 日韩欧美在线播放| 日本片在线看| 中文字幕一区二区三区最新| www.性欧美|