新聞中心
通過 reflect.Type 獲取結(jié)構(gòu)體成員信息 reflect.StructField 結(jié)構(gòu)中的 Tag 被稱為結(jié)構(gòu)體標(biāo)簽(Struct Tag)。結(jié)構(gòu)體標(biāo)簽是對結(jié)構(gòu)體字段的額外信息標(biāo)簽。

JSON、BSON 等格式進行序列化及對象關(guān)系映射(Object Relational Mapping,簡稱 ORM)系統(tǒng)都會用到結(jié)構(gòu)體標(biāo)簽,這些系統(tǒng)使用標(biāo)簽設(shè)定字段在處理時應(yīng)該具備的特殊屬性和可能發(fā)生的行為。這些信息都是靜態(tài)的,無須實例化結(jié)構(gòu)體,可以通過反射獲取到。
提示
結(jié)構(gòu)體標(biāo)簽(Struct Tag)類似于 C# 中的特性(Attribute)。C# 允許在類、字段、方法等前面添加 Attribute,然后在反射系統(tǒng)中可以獲取到這個屬性系統(tǒng)。例如:
[Conditional("DEBUG")]
public static void Message(string msg)
{
Console.WriteLine(msg);
}
結(jié)構(gòu)體標(biāo)簽的格式
Tag 在結(jié)構(gòu)體字段后方書寫的格式如下:
`key1:"value1" key2:"value2"`
結(jié)構(gòu)體標(biāo)簽由一個或多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個空格分隔。
從結(jié)構(gòu)體標(biāo)簽中獲取值
StructTag 擁有一些方法,可以進行 Tag 信息的解析和提取,如下所示:
- func(tag StructTag)Get(key string)string
- 根據(jù) Tag 中的鍵獲取對應(yīng)的值,例如 `key1:"value1"key2:"value2"` 的 Tag 中,可以傳入“key1”獲得“value1”。
- func(tag StructTag)Lookup(key string)(value string,ok bool)
- 根據(jù) Tag 中的鍵,查詢值是否存在。
結(jié)構(gòu)體標(biāo)簽格式錯誤導(dǎo)致的問題
編寫 Tag 時,必須嚴格遵守鍵值對的規(guī)則。結(jié)構(gòu)體標(biāo)簽的解析代碼的容錯能力很差,一旦格式寫錯,編譯和運行時都不會提示任何錯誤,參見下面這個例子:
package main
import (
"fmt"
"reflect"
)
func main() {
type cat struct {
Name string
Type int `json: "type" id:"100"`
}
typeOfCat := reflect.TypeOf(cat{})
if catType, ok := typeOfCat.FieldByName("Type"); ok {
fmt.Println(catType.Tag.Get("json"))
}
}代碼輸出空字符串,并不會輸出期望的 type。
第 12 行中,在
json:和
"type"之間增加了一個空格。這種寫法沒有遵守結(jié)構(gòu)體標(biāo)簽的規(guī)則,因此無法通過 Tag.Get 獲取到正確的 json 對應(yīng)的值。
這個錯誤在開發(fā)中非常容易被疏忽,造成難以察覺的錯誤。
網(wǎng)站標(biāo)題:創(chuàng)新互聯(lián)GO教程:Go語言結(jié)構(gòu)體標(biāo)簽(StructTag)
網(wǎng)站URL:http://m.fisionsoft.com.cn/article/cdeesgg.html


咨詢
建站咨詢
