校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > golang如何使用struct的tag屬性的詳細介紹

golang如何使用struct的tag屬性的詳細介紹

熱門標簽:西部云谷一期地圖標注 中國地圖標注省會高清 江西轉化率高的羿智云外呼系統 高德地圖標注口訣 浙江高速公路地圖標注 學海導航地圖標注 南通如皋申請開通400電話 廣州呼叫中心外呼系統 地圖標注的汽車標

從一個例子說起

我們經常會碰到下面格式的struct定義:

type Person struct {
  Name string `json:"name"`
  Age int  `json:"age"`
}

這個struct定義一個叫做Person的類型,包含兩個域Name和Age;但是在域的后面有神奇的 json:"name" ,這個用來干什么用?這篇文章試圖來解釋這個問題。

當golang的對象需要和json做轉換的時候,我們就經常用到這個特性。

有兩點注意的地方:

1、如果一個域不是以大寫字母開頭的,那么轉換成json的時候,這個域是被忽略的。

$ cat main.go
package main

import (
  "fmt"
  "encoding/json"
)

type Person struct {
  Name string `json:"name"`
  age int  `json:"age"`
}

func main() {
  person := Person { "tom", 12 }
  if b, err := json.Marshal(person); err != nil {
    fmt.Printf("error: %s", err.Error())
  } else {
    fmt.Printf("value: %s", b)
  }
}
$ go build -o main main.go 
$ ./main
value: {"name":"tom"}

我們看到轉換成json串之后,name正常輸出了,而age被丟棄了,因為age以小寫字母開頭。

2、如果沒有使用 json:"name" tag,那么輸出的json字段名和域名是一樣的。

$ cat main.go
package main

import (
  "fmt"
  "encoding/json"
)

type Person struct {
  Name string
  Age int
}

func main() {
  person := Person { "tom", 12 }
  if b, err := json.Marshal(person); err != nil {
    fmt.Printf("error: %s", err.Error())
  } else {
    fmt.Printf("value: %s", b)
  }
}
$ go build -o main main.go 
$ ./main
value: {"Name":"tom","Age":12}

我們看到輸出的json串使用的是struct定義的字段名。

總結一下, json:"name" 格式串是用來指導json.Marshal/Unmarshal,在進行json串和golang對象之間轉換的時候映射字段名使用的。再舉一個例子,json串和golang域名字可以任意轉換:

$ cat main.go

package main

import (
  "fmt"
  "encoding/json"
)

type Person struct {
  Name string  `json:"age"`
  Age int    `json:"address"`
}

func main() {
  person := Person { "tom", 12 }
  if b, err := json.Marshal(person); err != nil {
    fmt.Printf("error: %s", err.Error())
  } else {
    fmt.Printf("value: %s", b)
  }
}
$ go build -o main main.go 
$ ./main
value: {"age":"tom","address":12}

這個例子我們把Name映射成了 age,而把Age映射成address,當然這是個奇葩的映射,沒有任何正向意義,只有負向意義,只是為了說明可以進行任何名字映射而已。

如果我們去看json包的源代碼,我可以看到在encoding/json/encode.go, encoding/json/decode.go里面有讀取tag值得相關代碼。

tag := sf.Tag.Get("json")

也就是說這個json的tag是被json.Marshal和json.Unmarshal來使用的。

我們如何使用tag

還是以前的例子,Person有一個域Age,我們能不能限定Age的值在1-100之間,不至于太大,否則這個值沒有意義了。

$ cat main.go
package main

import (
  "fmt"
  "strings"
  "strconv"
  "reflect"
 _ "encoding/json"
)

type Person struct {
  Name string  `json:"name"`
  Age int    `json:"age" valid:"1-100"`
}

func (p * Person) validation() bool {
  v := reflect.ValueOf(*p)
  tag := v.Type().Field(1).Tag.Get("valid")
  val := v.Field(1).Interface().(int)
  fmt.Printf("tag=%v, val=%v\n", tag, val)
  
  result := strings.Split(tag, "-")
  var min, max int
  min, _ = strconv.Atoi(result[0])
  max, _ = strconv.Atoi(result[1])

  if val >= min  val = max {
    return true
  } else {
    return false
  }
}

func main() {
  person1 := Person { "tom", 12 }
  if person1.validation() {
    fmt.Printf("person 1: valid\n")
  } else {
    fmt.Printf("person 1: invalid\n")
  }
  person2 := Person { "tom", 250 }
  if person2.validation() {
    fmt.Printf("person 2 valid\n")
  } else {
    fmt.Printf("person 2 invalid\n")
  }
}

這么例子我們給Person添加了一個validate函數,validate驗證age是不是合理。

這個函數可以擴展對任意struct的任意valid域進行驗證。

$ cat main.go
package main

import (
  "fmt"
  "strings"
  "strconv"
  "reflect"
 _ "encoding/json"
)

type Person struct {
  Name string  `json:"name"`
  Age int    `json:"age" valid:"1-100"`
}

type OtherStruct struct {
  Age int    `valid:"20-300"`
}

func validateStruct(s interface{}) bool {
 v := reflect.ValueOf(s)

 for i := 0; i  v.NumField(); i++ {
  fieldTag  := v.Type().Field(i).Tag.Get("valid")
  fieldName  := v.Type().Field(i).Name
  fieldType  := v.Field(i).Type()
  fieldValue := v.Field(i).Interface()

  if fieldTag == "" || fieldTag == "-" {
    continue
  }

  if fieldName == "Age"  fieldType.String() == "int" {
    val := fieldValue.(int)

    tmp := strings.Split(fieldTag, "-")
    var min, max int
    min, _ = strconv.Atoi(tmp[0])
    max, _ = strconv.Atoi(tmp[1])
    if val >= min  val = max {
      return true
    } else {
      return false
    }
  }
 }
 return true
}

func main() {
  person1 := Person { "tom", 12 }
  if validateStruct(person1) {
    fmt.Printf("person 1: valid\n")
  } else {
    fmt.Printf("person 1: invalid\n")
  }

  person2 := Person { "jerry", 250 }
  if validateStruct(person2) {
    fmt.Printf("person 2: valid\n")
  } else {
    fmt.Printf("person 2: invalid\n")
  }

  other1 := OtherStruct { 12 }
  if validateStruct(other1) {
    fmt.Printf("other 1: valid\n")
  } else {
    fmt.Printf("other 1: invalid\n")
  }

  other2 := OtherStruct { 250 }
  if validateStruct(other2) {
    fmt.Printf("other 2: valid\n")
  } else {
    fmt.Printf("other 2: invalid\n")
  }
}

在這個例子中我們定義了一個函數validateStruct,接受任意一個struct作為參數;validateStruct為驗證struct中所有定義的Age字段,如果字段名字是Age,字段類型是int,并且定義了valid tag,那么就會驗證這個valid是否有效。

看執行結果:

$ go build -o main main.go
$ ./main
person 1: valid
person 2: invalid
other 1: invalid
other 2: valid

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang語言如何將interface轉為int, string,slice,struct等類型
  • Golang 如何解析和生成json
  • golang使用json格式實現增刪查改的實現示例
  • golang json.Marshal 特殊html字符被轉義的解決方法
  • golang 實現struct、json、map互相轉化

標簽:貴州 德宏 吐魯番 保定 東營 常州 曲靖 許昌

巨人網絡通訊聲明:本文標題《golang如何使用struct的tag屬性的詳細介紹》,本文關鍵詞  golang,如何,使用,struct,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang如何使用struct的tag屬性的詳細介紹》相關的同類信息!
  • 本頁收集關于golang如何使用struct的tag屬性的詳細介紹的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    精品国产伦一区二区三区观看方式| 亚洲一区二区三区自拍| 日韩av一区二| 色综合色综合色综合 | 欧美影院一区二区| 亚洲美女屁股眼交3| 国产.欧美.日韩| 久久精品综合网| 成人黄色av电影| 中文字幕日韩精品一区| 99精品视频在线观看| 国产精品人人做人人爽人人添| 久久97超碰色| 国产亚洲成av人在线观看导航| 国产suv精品一区二区6| 国产精品乱码一区二三区小蝌蚪| 成人av综合在线| 一区二区三区四区亚洲| 欧美日韩精品是欧美日韩精品| 亚洲成国产人片在线观看| 777色狠狠一区二区三区| 麻豆91小视频| 日本一区二区成人| 欧美特级限制片免费在线观看| 五月激情六月综合| 亚洲国产精品ⅴa在线观看| bt欧美亚洲午夜电影天堂| 午夜在线电影亚洲一区| 久久综合一区二区| 在线这里只有精品| 国产综合久久久久影院| 亚洲精品视频一区二区| 日韩女优制服丝袜电影| 91麻豆国产在线观看| 久久国产精品第一页| 一区二区三区日韩精品| 2020国产成人综合网| 在线播放国产精品二区一二区四区| 国产一区二区三区免费看| 亚洲一区二区三区爽爽爽爽爽 | 一区二区三区高清| wwwwww.欧美系列| 欧美电影免费观看高清完整版 | 日韩精品一级二级| 亚洲美女在线一区| 中文字幕制服丝袜一区二区三区 | 亚洲综合精品久久| 99精品国产99久久久久久白柏| 亚洲成a人v欧美综合天堂下载| 中文字幕视频一区| 亚洲欧洲国产日韩| 亚洲欧美一区二区三区久本道91| 久久亚洲一级片| 精品久久久久一区| 91精品国产综合久久精品性色| 欧美性受xxxx黑人xyx| 色婷婷久久综合| 日本道精品一区二区三区| 91黄视频在线| 欧美日韩国产精品成人| 日韩午夜在线播放| 久久午夜老司机| 亚洲国产精华液网站w| 亚洲欧美在线另类| 午夜精品一区二区三区电影天堂| 午夜欧美大尺度福利影院在线看| 亚洲地区一二三色| 九色综合狠狠综合久久| 国产乱对白刺激视频不卡| 成人伦理片在线| 欧美美女网站色| 国产肉丝袜一区二区| 日韩一区欧美小说| 七七婷婷婷婷精品国产| 激情欧美一区二区| 91视频在线观看| 日韩三级高清在线| 成人欧美一区二区三区黑人麻豆| 亚洲成av人片在线| 成人h动漫精品一区二区 | 精品系列免费在线观看| 不卡的电影网站| 337p日本欧洲亚洲大胆色噜噜| 国产精品国产三级国产普通话蜜臀| 亚洲黄一区二区三区| 欧美激情在线一区二区| 亚洲人成伊人成综合网小说| 蜜臀精品一区二区三区在线观看 | 另类小说视频一区二区| 99re亚洲国产精品| 久久久久久久综合| 久久精品国产网站| 欧美日韩激情一区二区三区| 中文字幕一区二区在线播放| 奇米亚洲午夜久久精品| 91精品国产综合久久久久久漫画| 亚洲欧美另类小说| av欧美精品.com| 国产精品久久久久9999吃药| 精品无码三级在线观看视频| 欧美日韩国产在线观看| 亚洲成人精品影院| 欧美在线一区二区三区| 亚洲日穴在线视频| 91蝌蚪porny成人天涯| 一区二区三区四区五区视频在线观看 | 欧美一区二区大片| 美日韩一区二区| 国产精品一区二区三区四区| 欧美体内she精高潮| 午夜精品一区二区三区电影天堂 | 欧美图区在线视频| 午夜日韩在线观看| 久久综合色婷婷| 不卡区在线中文字幕| 一级日本不卡的影视| 欧美高清hd18日本| 国产一区视频网站| 一色屋精品亚洲香蕉网站| 91九色02白丝porn| 老色鬼精品视频在线观看播放| 久久精品亚洲麻豆av一区二区 | 成人精品鲁一区一区二区| 亚洲精品欧美激情| 日韩精品一区二区三区视频在线观看| 日本vs亚洲vs韩国一区三区 | 色狠狠av一区二区三区| 日韩高清不卡一区| 专区另类欧美日韩| 26uuu精品一区二区在线观看| 99这里都是精品| 麻豆成人av在线| 亚洲高清视频在线| 日本一区二区三区高清不卡| 欧美日韩成人激情| www.一区二区| 国产麻豆精品95视频| 亚洲福利一二三区| 成人免费在线观看入口| 久久精品亚洲一区二区三区浴池| 欧美性受xxxx黑人xyx性爽| 成人免费毛片app| 久久99国产精品久久| 日韩激情在线观看| 日本伊人午夜精品| 亚洲mv大片欧洲mv大片精品| 一区二区三区免费看视频| 中文字幕的久久| 久久久av毛片精品| www国产成人免费观看视频 深夜成人网| 欧美精品日日鲁夜夜添| 欧美久久久影院| 91精品国产乱码久久蜜臀| 欧美精品丝袜久久久中文字幕| 在线观看成人免费视频| 欧美高清视频不卡网| 欧美二区三区的天堂| 欧美一级在线观看| 久久精品亚洲一区二区三区浴池 | 黑人巨大精品欧美黑白配亚洲| 日韩av二区在线播放| 激情综合色播五月| 成人av电影在线| 欧美高清激情brazzers| 精品国产乱码久久久久久闺蜜 | 欧美色图一区二区三区| 91精品在线麻豆| 国产女人18毛片水真多成人如厕| 国产精品伦理一区二区| 亚洲成人免费视频| 成人av网站在线观看免费| 亚洲黄色小视频| 亚洲日本韩国一区| 偷拍一区二区三区| 国产精品亚洲第一| 欧美三级在线看| 久久综合网色—综合色88| 亚洲综合丝袜美腿| 国产一区二区三区香蕉| 欧美日韩国产一级| 综合久久久久综合| 久久av老司机精品网站导航| 91精品福利在线| 国产日韩欧美不卡在线| 日韩电影在线观看电影| 色视频成人在线观看免| 久久久久久久久伊人| 麻豆久久久久久| 欧美色综合久久| 亚洲福利视频一区二区| 99视频有精品| 欧美激情一区二区在线| 美脚の诱脚舐め脚责91 | 日韩在线卡一卡二| 在线视频欧美精品| 中文字幕一区二区在线观看| 国产伦精品一区二区三区免费| 欧美一区二区啪啪| 日韩福利视频导航| 欧美第一区第二区|