Go 結構體標簽詳解


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


這些標簽也起到配置信息的作用,不過在實際工作中,為了代碼更直觀,這些應該放到配置信息里。
————————————————

原文鏈接:https://blog.csdn.net/benben_2015/java/article/details/79807792


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM