Go 結構體標籤詳解

hongmingover發表於2018-11-26

Go 結構體標籤詳解

 

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/benben_2015/article/details/79807792

Go結構體標籤

結構體的欄位除了名字和型別外,還可以有一個可選的標籤(tag):它是一個附屬於欄位的字串,可以是文件或其他的重要標記。比如在我們解析json或生成json檔案時,常用到encoding/json包,它提供一些預設標籤,例如:omitempty標籤可以在序列化的時候忽略0值或者空值。而-標籤的作用是不進行序列化,其效果和和直接將結構體中的欄位寫成小寫的效果一樣。

type Info struct {
    Name string
    Age  int `json:"age,omitempty"`
    Sex  string
}

在序列化和反序列化的時候,也支援型別轉化等操作。如

type Info struct {
    Name string
    Age  int   `json:"age,string"`
    //這樣生成的json物件中,age就為字串
    Sex  string
}
  •  

現在來了解下如何設定自定義的標籤,以及如何像官方包一樣,可以通過標籤,對欄位進行自定義處理。要實現這些,我們要用到reflect包。

package main

import (
    "fmt"
    "reflect"
)

const tagName = "Testing"

type Info struct {
    Name string `Testing:"-"`
    Age  int    `Testing:"age,min=17,max=60"`
    Sex  string `Testing:"sex,required"`
}

func main() {
    info := Info{
        Name: "benben",
        Age:  23,
        Sex:  "male",
    }

    //通過反射,我們獲取變數的動態型別
    t := reflect.TypeOf(info)
    fmt.Println("Type:", t.Name())
    fmt.Println("Kind:", t.Kind())

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i) //獲取結構體的每一個欄位
        tag := field.Tag.Get(tagName)
        fmt.Printf("%d. %v (%v), tag: '%v'\n", i+1, field.Name, field.Type.Name(), tag)
    }
}    

這些標籤也起到配置資訊的作用,不過在實際工作中,為了程式碼更直觀,這些應該放到配置資訊裡。

相關文章