国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Golang】Golang進階系列教程--為什么 Go 語言 struct 要使用 tags

這篇具有很好參考價值的文章主要介紹了【Golang】Golang進階系列教程--為什么 Go 語言 struct 要使用 tags。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

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

除了這些基本信息之外,Go 還提供了 struct tags,它可以用來指定 struct 中每個字段的元信息。
在本文中,我們將探討為什么 Go 語言中需要使用 struct tags,以及 struct tags 的使用場景和優(yōu)勢。

struct tags 的使用

struct tags 使用還是很廣泛的,特別是在 json 序列化,或者是數(shù)據(jù)庫 ORM 映射方面。
【Golang】Golang進階系列教程--為什么 Go 語言 struct 要使用 tags,# GoLang,golang,開發(fā)語言,后端

在定義上,它以 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 的反射庫提供了一些方法,可以讓我們在程序運行時獲取和解析結(jié)構體標簽。
介紹這些方法之前,先來看看 reflect.StructField ,它是描述結(jié)構體字段的數(shù)據(jù)類型。定義如下:

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

結(jié)構體中還有一些其他字段,被我省略了,只保留了和本文相關的。
在結(jié)構體的反射中,我們經(jīng)常使用 reflect.TypeOf 獲取類型信息,然后使用 Type.Field 或 Type.FieldByName() 獲取結(jié)構體字段的 reflect.StructField,然后根據(jù) StructField 中的信息做進一步處理。
例如,可以通過 StructField.Tag.Get 方法獲取結(jié)構體字段的標簽值。
下面看一段代碼:

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)
}

運行以上代碼,輸出結(jié)果如下:

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ù)深入學習。

Tag Documentation
xml pkg.go.dev/encoding/xm…
json pkg.go.dev/encoding/js…
asn1 pkg.go.dev/encoding/as…
reform pkg.go.dev/gopkg.in/re…
dynamodb docs.aws.amazon.com/sdk-for-go/…
bigquery pkg.go.dev/cloud.googl…
datastore pkg.go.dev/cloud.googl…
spanner pkg.go.dev/cloud.googl…
bson pkg.go.dev/labix.org/v…, pkg.go.dev/go.mongodb.…
gorm pkg.go.dev/github.com/…
yaml pkg.go.dev/gopkg.in/ya…
toml pkg.go.dev/github.com/…
validate github.com/go-playgrou…
mapstructure pkg.go.dev/github.com/…
parser pkg.go.dev/github.com/…
protobuf github.com/golang/prot…
db github.com/jmoiron/sql…
url github.com/google/go-q…
feature github.com/nikolaydubi…

以上就是本文的全部內(nèi)容。

參考文章:

github.com/golang/go/w…文章來源地址http://www.zghlxwxcb.cn/news/detail-613596.html

到了這里,關于【Golang】Golang進階系列教程--為什么 Go 語言 struct 要使用 tags的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 是時候回答【我為什么要學習 Go 語言(golang)】這個問題了

    想必每個人在學習新事物之前,都會捫心自問:“我為什么要學習它呢?” 正如我們讀 四大名著 一般,也只有在您讀過了 四大名著 后,再細看中國幾千年歷史不就是 天下大勢合久必分,分久必合 ,再者,便是與友數(shù)人相聚,席間您述說您通勤時所遇到有意思的事了,而您

    2023年04月09日
    瀏覽(19)
  • 【Golang】一篇文章帶你快速了解Go語言&為什么你要學習Go語言

    【Golang】一篇文章帶你快速了解Go語言&為什么你要學習Go語言

    目錄 1. 為什么互聯(lián)網(wǎng)世界需要Go語言 1.1 硬件限制:摩爾定律已然失效? 1.2 Go語言為并發(fā)而生 1.3 Go性能強悍 1.4 Go語言簡單易學 1.4.1 語法簡潔 1.4.2 代碼風格統(tǒng)一 1.4.3開發(fā)效率高? 2.Go語言的誕生與發(fā)展 2.1什么是Go語言? ?2.2 Go語言的誕生 2.3?Go Gopher——Go語言的吉祥物 3. 為什么

    2024年02月04日
    瀏覽(37)
  • 【Golang】Golang進階系列教程--Go 語言 map 如何順序讀???

    Go 語言中的 map 是一種非常強大的數(shù)據(jù)結(jié)構,它允許我們快速地存儲和檢索鍵值對。 然而,當我們遍歷 map 時,會有一個有趣的現(xiàn)象,那就是輸出的鍵值對順序是不確定的。 先看一段代碼示例: 當我們多執(zhí)行幾次這段代碼時,就會發(fā)現(xiàn),輸出的順序是不同的。 首先,Go 語言

    2024年02月14日
    瀏覽(96)
  • 【Golang】Golang進階系列教程--Go 語言切片是如何擴容的?

    【Golang】Golang進階系列教程--Go 語言切片是如何擴容的?

    在 Go 語言中,有一個很常用的數(shù)據(jù)結(jié)構,那就是切片(Slice)。 切片是一個擁有相同類型元素的可變長度的序列,它是基于數(shù)組類型做的一層封裝。它非常靈活,支持自動擴容。 切片是一種引用類型,它有三個屬性:指針,長度和容量。 底層源碼定義如下: 指針: 指向

    2024年02月14日
    瀏覽(103)
  • 【Golang】Golang進階系列教程--Go 語言數(shù)組和切片的區(qū)別

    【Golang】Golang進階系列教程--Go 語言數(shù)組和切片的區(qū)別

    在 Go 語言中,數(shù)組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。 數(shù)組和切片是兩個常用的數(shù)據(jù)結(jié)構。它們都可以用于存儲一組相同類型的元素,但在底層實現(xiàn)和使用方式上存在一些重要的區(qū)別。 Go 中數(shù)組的長度是不可改變的

    2024年02月15日
    瀏覽(31)
  • Go 語言為什么很少使用數(shù)組?

    大家好,我是 frank,「Golang 語言開發(fā)?!构娞栕髡摺?01 介紹 在 Go 語言中,數(shù)組是一塊連續(xù)的內(nèi)存,數(shù)組不可以擴容,數(shù)組在作為參數(shù)傳遞時,屬于值傳遞。 數(shù)組的長度和類型共同決定數(shù)組的類型,不同類型的數(shù)組之間不可以比較,否則在編譯時會報錯。 因為數(shù)組的一些

    2024年02月04日
    瀏覽(21)
  • 為什么選擇Go語言編寫網(wǎng)絡應用程序

    為什么選擇Go語言編寫網(wǎng)絡應用程序

    關注公眾號【愛發(fā)白日夢的后端】分享技術干貨、讀書筆記、開源項目、實戰(zhàn)經(jīng)驗、高效開發(fā)工具等,您的關注將是我的更新動力! 作為一名后端開發(fā)者,你一定對選擇合適的編程語言來編寫網(wǎng)絡應用程序非常重視。在眾多的編程語言中,Go語言(Golang)憑借其獨特的特性和

    2024年02月02日
    瀏覽(21)
  • Go 語言為什么不支持并發(fā)讀寫 map?

    大家好,我是 frank ,「 Golang 語言開發(fā)棧」公眾號作者。 01 介紹 在 Go 語言項目開發(fā)中,我們經(jīng)常會使用哈希表 map ,它的時間復雜度是 O(1) ,Go 語言中的 map 使用開放尋址法避免哈希碰撞。 Go 語言中的 map 并非原子操作,不支持并發(fā)讀寫操作。 Go 官方認為 map 在大多數(shù)情況下

    2024年02月02日
    瀏覽(32)
  • Go 語言為什么建議多使用切片,少使用數(shù)組?

    大家好,我是 frank,「Golang 語言開發(fā)?!构娞栕髡?。 01 介紹 在 Go 語言中,數(shù)組固定長度,切片可變長度;數(shù)組和切片都是值傳遞,因為切片傳遞的是指針,所以切片也被稱為“引用傳遞”。 讀者朋友們在使用 Go 語言開發(fā)項目時,或者在閱讀 Go 開源項目源碼時,發(fā)現(xiàn)很少

    2024年02月03日
    瀏覽(33)
  • 為什么說 Go 語言字符串是不可變的?

    原文鏈接: 為什么說 Go 語言字符串是不可變的? 最近有讀者留言說,平時在寫代碼的過程中,是會對字符串進行修改的,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢? 這個問題本身并不困難,但對于新手來說確實容易產(chǎn)生困惑,今天就來回答一下。 首先來看看它

    2024年02月07日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包