亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 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屬性的詳細介紹的相關信息資訊供網民參考!
  • 推薦文章
    日本在线不卡免费视频一区| 九九免费高清在线观看视频| 精品国产亚洲人成在线| 一级片片| 久久精品店| 九九久久国产精品| 免费毛片播放| 日韩男人天堂| 国产网站免费| 久久成人性色生活片| 国产一区免费观看| 一级毛片视频免费| 青青青草视频在线观看| 精品久久久久久中文字幕2017| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美一级视频免费| 国产伦精品一区二区三区无广告| 99热精品一区| 国产a视频| 精品视频免费看| a级精品九九九大片免费看| 91麻豆精品国产高清在线| 日日夜夜婷婷| 亚欧成人毛片一区二区三区四区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产一区二区精品久| 精品视频免费在线| 一级毛片视频免费| 午夜在线亚洲男人午在线| 四虎影视库国产精品一区| 精品国产一区二区三区久久久蜜臀| 精品视频一区二区三区免费| 国产91精品一区| 中文字幕97| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲 男人 天堂| 精品视频在线观看一区二区| 黄色免费网站在线| 亚欧乱色一区二区三区| 久久99爰这里有精品国产| 免费毛片播放| 久久精品免视看国产明星| 黄视频网站在线看| 国产成人女人在线视频观看| 你懂的日韩| 美女免费精品视频在线观看| 中文字幕97| 美女被草网站| 久久国产一区二区| 青青久久精品| 欧美电影免费| 四虎久久精品国产| 韩国毛片 免费| 成人免费网站视频ww| 91麻豆精品国产高清在线| 毛片高清| 国产一级强片在线观看| 欧美激情一区二区三区视频高清| 精品久久久久久中文字幕一区 | 免费一级片在线观看| 精品国产一区二区三区免费| 黄色短视频网站| 日韩专区亚洲综合久久| 九九精品在线播放| 日本在线www| 在线观看导航| 国产综合91天堂亚洲国产| 国产国语对白一级毛片| 日本在线不卡视频| 一级女性大黄生活片免费| 亚洲 欧美 91| 精品国产一区二区三区久久久狼| 一本伊大人香蕉高清在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久精品免视看国产明星| 国产视频一区二区在线播放| 免费毛片播放| 免费国产在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 青青青草影院 | 你懂的在线观看视频| 国产极品精频在线观看| 97视频免费在线| 美女被草网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久久久久久免费视频| 国产一区二区精品久久| 亚洲精品中文字幕久久久久久| 国产美女在线一区二区三区| 亚久久伊人精品青青草原2020| 国产伦久视频免费观看视频| 99热热久久| 国产美女在线观看| 91麻豆爱豆果冻天美星空| 日韩专区第一页| 黄视频网站在线观看| 日韩男人天堂| 国产91视频网| 91麻豆精品国产片在线观看| 黄视频网站免费| 国产一区二区精品| 亚洲第一视频在线播放| 午夜激情视频在线观看| 亚欧成人毛片一区二区三区四区| 九九精品在线播放| 日本乱中文字幕系列| 免费一级片网站| 日韩字幕在线| 日本特黄特色aa大片免费| 国产麻豆精品| 国产激情视频在线观看| 欧美激情一区二区三区视频 | 国产韩国精品一区二区三区| 麻豆系列国产剧在线观看| 97视频免费在线| 国产美女在线一区二区三区| 黄视频网站免费| 你懂的日韩| 九九免费精品视频| 精品久久久久久免费影院| 成人高清视频免费观看| 日韩中文字幕在线亚洲一区| 国产一区精品| 精品国产一区二区三区久| 一级女性全黄久久生活片| 日韩av东京社区男人的天堂| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久国产一区二区| 免费国产在线观看| 四虎论坛| 亚洲www美色| 亚州视频一区二区| 国产一区精品| 国产成人精品综合在线| 国产成人欧美一区二区三区的| 欧美激情一区二区三区视频 | 精品视频在线观看一区二区三区| 日本特黄特色aa大片免费| 你懂的日韩| 色综合久久久久综合体桃花网| 可以在线看黄的网站| 精品美女| 成人免费高清视频| 色综合久久天天综合绕观看| 精品视频免费看| 毛片成人永久免费视频| 你懂的福利视频| 99色视频在线观看| 国产麻豆精品hdvideoss| 精品视频一区二区三区免费| 日韩专区一区| 久草免费在线色站| 国产91精品一区| 国产网站免费| 国产高清视频免费观看| 国产视频一区二区三区四区| 美女免费精品视频在线观看| 欧美大片a一级毛片视频| 香蕉视频久久| 香蕉视频三级| 成人免费观看男女羞羞视频| 亚洲精品久久玖玖玖玖| 色综合久久天天综合绕观看| 国产精品自拍亚洲| 国产不卡精品一区二区三区| 天天做日日干| 国产精品1024永久免费视频 | a级毛片免费全部播放| 欧美国产日韩在线| 日韩avdvd| 国产一区二区精品久| 日本免费看视频| 欧美激情一区二区三区在线| 久久精品大片| 四虎影视久久| 一a一级片| 国产亚洲精品成人a在线| 成人高清护士在线播放| 成人免费网站视频ww| 精品视频免费看| 美女免费黄网站| 日韩中文字幕在线亚洲一区| 精品久久久久久影院免费| 亚洲精品影院久久久久久| 亚洲精品影院久久久久久| 国产一区二区精品久久91| 成人a大片高清在线观看| 成人在激情在线视频| 日本特黄特色aa大片免费| 国产精品自拍在线| 欧美激情一区二区三区在线| 欧美激情伊人| 久久国产精品自由自在| 九九久久99| 精品视频免费在线| 美女免费精品视频在线观看| 久久精品大片| 美女被草网站| 日本伦理网站| 久久成人亚洲|