亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言struct要使用?tags的原因解析

 更新時間:2023年03月11日 15:15:39   作者:yongxinz  
這篇文章主要介紹了為什么?Go?語言?struct?要使用?tags,在本文中,我們將探討為什么 Go 語言中需要使用 struct tags,以及 struct tags 的使用場景和優(yōu)勢,需要的朋友可以參考下

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

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

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

struct tags 的使用

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

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

使用反引號

在聲明 struct tag 時,使用反引號 ` 包圍 tag 的值,可以防止轉(zhuǎn)義字符的影響,使 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 值之間。使用空格可能會導致編碼或解碼錯誤,并使代碼更難以維護。例如:

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

// 規(guī)范的寫法
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,從而導致編碼或解碼錯誤。例如:

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

// 規(guī)范的寫法
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 名稱。

例如,對于序列化和反序列化,可以使用 json、xml、yaml 等;對于數(shù)據(jù)庫操作,可以使用 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 ,它是描述結構體字段的數(shù)據(jù)類型。定義如下:

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

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

在結構體的反射中,我們經(jīng)常使用 reflect.TypeOf 獲取類型信息,然后使用 Type.FieldType.FieldByName() 獲取結構體字段的 reflect.StructField,然后根據(jù) 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 的優(yōu)勢

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

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

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

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

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

常用的 struct tags

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

TagDocumentation
xmlhttps://pkg.go.dev/encoding/xml
jsonhttps://pkg.go.dev/encoding/json
asn1https://pkg.go.dev/encoding/asn1
reformhttps://pkg.go.dev/gopkg.in/reform.v1
dynamodbhttps://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/dynamodbattribute/#Marshal
bigqueryhttps://pkg.go.dev/cloud.google.com/go/bigquery
datastorehttps://pkg.go.dev/cloud.google.com/go/datastore
spannerhttps://pkg.go.dev/cloud.google.com/go/spanner
bsonhttps://pkg.go.dev/labix.org/v2/mgo/bsonhttps://pkg.go.dev/go.mongodb.org/mongo-driver/bson/bsoncodec
gormhttps://pkg.go.dev/github.com/jinzhu/gorm
yamlhttps://pkg.go.dev/gopkg.in/yaml.v2
tomlhttps://pkg.go.dev/github.com/pelletier/go-toml
validatehttps://github.com/go-playground/validator
mapstructurehttps://pkg.go.dev/github.com/mitchellh/mapstructure
parserhttps://pkg.go.dev/github.com/alecthomas/participle
protobufhttps://github.com/golang/protobuf
dbhttps://github.com/jmoiron/sqlx
urlhttps://github.com/google/go-querystring
featurehttps://github.com/nikolaydubina/go-featureprocessing

以上就是本文的全部內(nèi)容,如果覺得還不錯的話歡迎點贊,轉(zhuǎn)發(fā)和關注,感謝支持。

參考文章:

https://github.com/golang/go/wiki/Well-known-struct-tags

到此這篇關于為什么 Go 語言 struct 要使用 tags的文章就介紹到這了,更多相關Go 語言 struct 要使用 tags內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go來合并兩個csv的實現(xiàn)示例

    Go來合并兩個csv的實現(xiàn)示例

    本文主要介紹了Go來合并兩個csv的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Go語言JSON編解碼神器之marshal的運用

    Go語言JSON編解碼神器之marshal的運用

    這篇文章主要為大家詳細介紹了Go語言中JSON編解碼神器——marshal的運用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • Go語言學習之時間函數(shù)使用詳解

    Go語言學習之時間函數(shù)使用詳解

    這篇文章主要為大家詳細介紹了Go語言中時間函數(shù)的使用方法,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Go語言基礎語法和基本數(shù)據(jù)類型知識鞏固

    Go語言基礎語法和基本數(shù)據(jù)類型知識鞏固

    這篇文章主要為大家介紹了Go語言基礎語法和基本數(shù)據(jù)類型知識鞏固,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • go等待一組協(xié)程結束的操作方式

    go等待一組協(xié)程結束的操作方式

    這篇文章主要介紹了go等待一組協(xié)程結束的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 一文帶你深入了解Go語言中切片的奧秘

    一文帶你深入了解Go語言中切片的奧秘

    切片是數(shù)組的一個引用,因此切片是引用類型。但自身是結構體,值拷貝傳遞。本文將通過示例帶大家一起探索一下Go語言中切片的奧秘,感興趣的可以了解一下
    2022-11-11
  • Go語言實現(xiàn)順序存儲的線性表實例

    Go語言實現(xiàn)順序存儲的線性表實例

    這篇文章主要介紹了Go語言實現(xiàn)順序存儲的線性表的方法,實例分析了Go語言實現(xiàn)線性表的定義、插入、刪除元素等的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Golang基于Vault實現(xiàn)敏感數(shù)據(jù)加解密

    Golang基于Vault實現(xiàn)敏感數(shù)據(jù)加解密

    數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護技術之一,敏感數(shù)據(jù)應該加密存儲在數(shù)據(jù)庫中,降低泄露風險,本文將介紹一下利用Vault實現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下
    2023-07-07
  • Golang請求fasthttp實踐

    Golang請求fasthttp實踐

    本文主要介紹了Golang請求fasthttp實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Go設計模式之原型模式圖文詳解

    Go設計模式之原型模式圖文詳解

    原型模式是一種創(chuàng)建型設計模式, 使你能夠復制已有對象, 而又無需使代碼依賴它們所屬的類,本文將通過圖片和文字讓大家可以詳細的了解Go的原型模式,感興趣的通過跟著小編一起來看看吧
    2023-07-07

最新評論