日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言結(jié)構(gòu)體標(biāo)簽(StructTag)

通過 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 等格式進(jìn)行序列化及對象關(guān)系映射(Object Relational Mapping,簡稱 ORM)系統(tǒng)都會(huì)用到結(jié)構(gòu)體標(biāo)簽,這些系統(tǒng)使用標(biāo)簽設(shè)定字段在處理時(shí)應(yīng)該具備的特殊屬性和可能發(fā)生的行為。這些信息都是靜態(tài)的,無須實(shí)例化結(jié)構(gòu)體,可以通過反射獲取到。

提示

結(jié)構(gòu)體標(biāo)簽(Struct Tag)類似于 C# 中的特性(Attribute)。C# 允許在類、字段、方法等前面添加 Attribute,然后在反射系統(tǒng)中可以獲取到這個(gè)屬性系統(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)簽由一個(gè)或多個(gè)鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個(gè)空格分隔。

從結(jié)構(gòu)體標(biāo)簽中獲取值

StructTag 擁有一些方法,可以進(jìn)行 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)簽格式錯(cuò)誤導(dǎo)致的問題

編寫 Tag 時(shí),必須嚴(yán)格遵守鍵值對的規(guī)則。結(jié)構(gòu)體標(biāo)簽的解析代碼的容錯(cuò)能力很差,一旦格式寫錯(cuò),編譯和運(yùn)行時(shí)都不會(huì)提示任何錯(cuò)誤,參見下面這個(gè)例子:

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

}

代碼輸出空字符串,并不會(huì)輸出期望的 type。

第 12 行中,在
json:
"type"之間增加了一個(gè)空格。這種寫法沒有遵守結(jié)構(gòu)體標(biāo)簽的規(guī)則,因此無法通過 Tag.Get 獲取到正確的 json 對應(yīng)的值。

這個(gè)錯(cuò)誤在開發(fā)中非常容易被疏忽,造成難以察覺的錯(cuò)誤。


分享標(biāo)題:創(chuàng)新互聯(lián)GO教程:Go語言結(jié)構(gòu)體標(biāo)簽(StructTag)
網(wǎng)頁地址:http://www.5511xx.com/article/cdeesgg.html