<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      為什么 Go 語言 struct 要使用 tags

      原文鏈接:為什么 Go 語言 struct 要使用 tags

      在 Go 語言中,struct 是一種常見的數據類型,它可以用來表示復雜的數據結構。在 struct 中,我們可以定義多個字段,每個字段可以有不同的類型和名稱。

      除了這些基本信息之外,Go 還提供了 struct tags,它可以用來指定 struct 中每個字段的元信息。

      在本文中,我們將探討為什么 Go 語言中需要使用 struct tags,以及 struct tags 的使用場景和優勢。

      struct tags 的使用

      struct tags 使用還是很廣泛的,特別是在 json 序列化,或者是數據庫 ORM 映射方面。

      在定義上,它以 key:value 的形式出現,跟在 struct 字段后面,除此之外,還有以下幾點需要注意:

      使用反引號

      在聲明 struct tag 時,使用反引號 ` 包圍 tag 的值,可以防止轉義字符的影響,使 tag 更容易讀取和理解。例如:

      type User struct {
          ID    int    `json:"id" db:"id"`
          Name  string `json:"name" db:"name"`
          Email string `json:"email" db:"email"`
      }
      

      避免使用空格

      在 struct tag 中,應該避免使用空格,特別是在 tag 名稱和 tag 值之間。使用空格可能會導致編碼或解碼錯誤,并使代碼更難以維護。例如:

      // 不規范的寫法
      type User struct {
          ID    int    `json: "id" db: "id"`
          Name  string `json: "name" db: "name"`
          Email string `json: "email" db: "email"`
      }
      
      // 規范的寫法
      type User struct {
          ID    int    `json:"id" db:"id"`
          Name  string `json:"name" db:"name"`
          Email string `json:"email" db:"email"`
      }
      

      避免重復

      在 struct 中,應該避免重復使用同一個 tag 名稱。如果重復使用同一個 tag 名稱,編譯器可能會無法識別 tag,從而導致編碼或解碼錯誤。例如:

      // 不規范的寫法
      type User struct {
          ID    int    `json:"id" db:"id"`
          Name  string `json:"name" db:"name"`
          Email string `json:"email" db:"name"`
      }
      
      // 規范的寫法
      type User struct {
          ID    int    `json:"id" db:"id"`
          Name  string `json:"name" db:"name"`
          Email string `json:"email" db:"email"`
      }
      

      使用標準化的 tag 名稱

      為了使 struct tag 更加標準化和易于維護,應該使用一些標準化的 tag 名稱。

      例如,對于序列化和反序列化,可以使用 jsonxmlyaml 等;對于數據庫操作,可以使用 db

      type User struct {
          ID       int    `json:"id" db:"id"`
          Name     string `json:"name" db:"name"`
          Password string `json:"-" db:"password"` // 忽略該字段
          Email    string `json:"email" db:"email"`
      }
      

      其中,Password 字段后面的 - 表示忽略該字段,也就是說該字段不會被序列化或反序列化。

      多個 tag 值

      如果一個字段需要指定多個 tag 值,可以使用 , 將多個 tag 值分隔開。例如:

      type User struct {
          ID        int    `json:"id" db:"id"`
          Name      string `json:"name" db:"name"`
          Email     string `json:"email,omitempty" db:"email,omitempty"`
      }
      

      其中 omitempty 表示如果該字段值為空,則不序列化該字段。

      struct tags 的原理

      Go 的反射庫提供了一些方法,可以讓我們在程序運行時獲取和解析結構體標簽。

      介紹這些方法之前,先來看看 reflect.StructField ,它是描述結構體字段的數據類型。定義如下:

      type StructField struct {
          Name      string      // 字段名
          Type      Type        // 字段類型
          Tag       StructTag   // 字段標簽
      }
      

      結構體中還有一些其他字段,被我省略了,只保留了和本文相關的。

      在結構體的反射中,我們經常使用 reflect.TypeOf 獲取類型信息,然后使用 Type.FieldType.FieldByName() 獲取結構體字段的 reflect.StructField,然后根據 StructField 中的信息做進一步處理。

      例如,可以通過 StructField.Tag.Get 方法獲取結構體字段的標簽值。

      下面看一段代碼:

      package main
      
      import (
          "fmt"
          "reflect"
      )
      
      type User struct {
          Name string `json:"name"`
          Age  int    `json:"age"`
      }
      
      type Manager struct {
          Title string `json:"title"`
          User
      }
      
      func main() {
          m := Manager{Title: "Manager", User: User{Name: "Alice", Age: 25}}
      
          mt := reflect.TypeOf(m)
      
          // 獲取 User 字段的 reflect.StructField
          userField, _ := mt.FieldByName("User")
          fmt.Println("Field 'User' exists:", userField.Name, userField.Type)
      
          // 獲取 User.Name 字段的 reflect.StructField
          nameField, _ := userField.Type.FieldByName("Name")
          tag := nameField.Tag.Get("json")
          fmt.Println("User.Name tag:", tag)
      }
      

      運行以上代碼,輸出結果如下:

      Field 'User' exists: User {string int}
      User.Name tag: "name"
      

      struct tags 的優勢

      使用 struct tag 的主要優勢之一是可以在運行時通過反射來訪問和操作 struct 中的字段

      比如在 Go Web 開發中,常常需要將 HTTP 請求中的參數綁定到一個 struct 中。這時,我們可以使用 struct tag 指定每個字段對應的參數名稱、驗證規則等信息。在接收到 HTTP 請求時,就可以使用反射機制讀取這些信息,并根據信息來驗證參數是否合法。

      另外,在將 struct 序列化為 JSON 或者其他格式時,我們也可以使用 struct tag 來指定每個字段在序列化時的名稱和規則。

      此外,使用 struct tag 還可以提高代碼的可讀性可維護性。在一個大型的項目中,struct 中的字段通常會包含很多不同的元信息,比如數據庫中的表名、字段名、索引、驗證規則等等。

      如果沒有 struct tag,我們可能需要將這些元信息放在注釋中或者在代碼中進行硬編碼。這樣會讓代碼變得難以維護和修改。而使用 struct tag 可以將這些元信息與 struct 字段緊密關聯起來,使代碼更加清晰和易于維護。

      常用的 struct tags

      在 Go 的官方 wiki 中,有一個常用的 struct tags 的庫的列表,我復制在下面了,感興趣的同學可以看看源碼,再繼續深入學習。

      Tag Documentation
      xml https://pkg.go.dev/encoding/xml
      json https://pkg.go.dev/encoding/json
      asn1 https://pkg.go.dev/encoding/asn1
      reform https://pkg.go.dev/gopkg.in/reform.v1
      dynamodb https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/dynamodbattribute/#Marshal
      bigquery https://pkg.go.dev/cloud.google.com/go/bigquery
      datastore https://pkg.go.dev/cloud.google.com/go/datastore
      spanner https://pkg.go.dev/cloud.google.com/go/spanner
      bson https://pkg.go.dev/labix.org/v2/mgo/bson, https://pkg.go.dev/go.mongodb.org/mongo-driver/bson/bsoncodec
      gorm https://pkg.go.dev/github.com/jinzhu/gorm
      yaml https://pkg.go.dev/gopkg.in/yaml.v2
      toml https://pkg.go.dev/github.com/pelletier/go-toml
      validate https://github.com/go-playground/validator
      mapstructure https://pkg.go.dev/github.com/mitchellh/mapstructure
      parser https://pkg.go.dev/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

      以上就是本文的全部內容,如果覺得還不錯的話歡迎點贊轉發關注,感謝支持。


      參考文章:

      推薦閱讀:

      posted @ 2023-03-11 14:13  yongxinz  閱讀(1117)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 毛片av在线尤物一区二区| 麻豆精品一区二区综合av| 午夜成人精品福利网站在线观看 | 亚洲韩欧美第25集完整版| 亚洲精品中文字幕二区| 亚洲精品码中文在线观看| 动漫精品中文字幕无码| 无码人妻aⅴ一区二区三区蜜桃| 精品无码久久久久国产动漫3d| 国产精品中文av专线| 毛片无码免费无码播放| 久久人妻精品大屁股一区| 九九热在线视频精品免费| 人人做人人澡人人人爽| 久久国产热这里只有精品| 国产精品国产三级国快看| 国产成人片无码视频| 97av| 亚洲精品国产免费av| 亚洲精品久久久久久久久久吃药| 精品日本免费一区二区三区| 国产精品亚洲二区在线看| 四虎影院176| 久久综合给合久久狠狠狠88| 宫西光有码视频中文字幕| 999精品全免费观看视频| 亚洲色大成网站www在线| 亚洲精品一区二区三区在| 国产乱码精品一品二品| 成人av天堂男人资源站| 亚洲第一极品精品无码久久| 18岁日韩内射颜射午夜久久成人| 日本激情久久精品人妻热| 免费无码AV一区二区波多野结衣| 久久中文字幕无码专区| 成人午夜激情在线观看| 性高湖久久久久久久久| 熟女精品色一区二区三区| 国产午夜亚洲精品国产成人| 丹寨县| 中文字幕人妻中出制服诱惑|