C語言中文網 目錄
首頁 > Go語言教程 > Go語言反射 閱讀:2,220

Go語言結構體標簽(Struct Tag)

通過 reflect.Type 獲取結構體成員信息 reflect.StructField 結構中的 Tag 被稱為結構體標簽(Struct Tag)。結構體標簽是對結構體字段的額外信息標簽。

JSON、BSON 等格式進行序列化及對象關系映射(Object Relational Mapping,簡稱 ORM)系統都會用到結構體標簽,這些系統使用標簽設定字段在處理時應該具備的特殊屬性和可能發生的行為。這些信息都是靜態的,無須實例化結構體,可以通過反射獲取到。

提示

結構體標簽(Struct Tag)類似于 C# 中的特性(Attribute)。C# 允許在類、字段、方法等前面添加 Attribute,然后在反射系統中可以獲取到這個屬性系統。例如:

[Conditional("DEBUG")]
public static void Message(string msg)
{
    Console.WriteLine(msg);
}

結構體標簽的格式

Tag 在結構體字段后方書寫的格式如下:

`key1:"value1" key2:"value2"`

結構體標簽由一個或多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個空格分隔。

從結構體標簽中獲取值

StructTag 擁有一些方法,可以進行 Tag 信息的解析和提取,如下所示:
  • func(tag StructTag)Get(key string)string
  • 根據 Tag 中的鍵獲取對應的值,例如 `key1:"value1"key2:"value2"` 的 Tag 中,可以傳入“key1”獲得“value1”。
  • func(tag StructTag)Lookup(key string)(value string,ok bool)
  • 根據 Tag 中的鍵,查詢值是否存在。

結構體標簽格式錯誤導致的問題

編寫 Tag 時,必須嚴格遵守鍵值對的規則。結構體標簽的解析代碼的容錯能力很差,一旦格式寫錯,編譯和運行時都不會提示任何錯誤,參見下面這個例子:
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"之間增加了一個空格。這種寫法沒有遵守結構體標簽的規則,因此無法通過 Tag.Get 獲取到正確的 json 對應的值。

這個錯誤在開發中非常容易被疏忽,造成難以察覺的錯誤。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo