如reflect文檔中所述。StructTag,按照慣例,標記字符串的值是由空格分隔的鍵:“值”的成對列表,例如:
類型用戶結構{
名稱字符串` JSON:“name“XML:“name“`
}
鍵通常代表壹個包,後面的“值”是例如處理/使用json鍵的編碼/json包。
如果您想要傳入多個消息“值”,通常可以通過用逗號(‘,‘)分隔來指定它,如
名稱字符串` JSON:“name,omit empty“XML:“name“` 1
破折號(‘-‘)“值”通常用於表示該字段被排除在過程之外(例如,在這種情況下,json意味著該字段未被封送或解封送)。
使用反射訪問自定義標簽的示例
我們可以使用reflect包來訪問結構字段的標記值。基本上,我們需要獲得壹個類型結構的,然後我們可以使用類型。字段(I
Int)或查詢字段類型。FieldByName(名稱
字符串)。這些方法返回的值StructField描述/表示壹個結構字段;和結構字段。標記是StructTag描述/表示標記值的類型值。
我們之前討論過“慣例”。該約定意味著如果您遵循它,則可以使用StructTag。獲取(鍵。
String)它解析變量的值並返回方法“value”的關鍵規範。該約定實現/內置於該Get()方法中。如果不遵守約定,Get()將無法解析鍵:“值”對並找到您要尋找的內容。這也不是問題,但是您需要實現自己的解析邏輯。
還有StructTag。Lookup()(在Go1.7中添加),它“類似於Get(),但區分了不包含給定鍵的標記和將空字符串與給定鍵相關聯的標記”。那麽,看壹個簡單的例子:
類型用戶結構{
名字?string ` mytag:“my name“`
電子郵件字符串` mytag:“mymail“`}
u:= User {“Bob“,“Bob @ my company . com“}
t :=反射。type of(u)for _,field Name:= range【】string {“Name“,“Email“} {
字段,找到:= t . field by name(field name)if!找到{繼續
}
fmt。printf(“\ n字段:用戶。%s\n“,字段名)
fmt。printf(“\ t全局標記值:%q\n“,字段。標簽)
fmt。printf(“\ t‘mytag‘的值:%q\n“,字段。tag . Get(“mytag“))
}
輸出(在Go遊樂場試玩):
字段:用戶。名字
完整的標簽值:“我的標簽:“我的名字”
“我的標簽”字段的值:用戶。電子郵件
整個標簽值:“我的標簽:“我的郵件”
“我的標簽”的值:“我的郵件”
GopherCon 2015有壹個關於struct標簽的演示,名為:結構標簽的許多面(幻燈片)。
(和視頻)以下是常用的tab鍵列表:
Json-由編碼/json包裝器用來指定Json。Marshal()。
Xml-由編碼/xml包裝器使用,指定Xml。Marshal()。
Bson-由goBson用來指定bson。元帥()
Protobuf-由github.com/golang/protobuf/proto,開發,在軟件包doc中有詳細描述。
Yaml-由gopkg.in/yaml.v2包裝公司使用。請指定yaml。Marshal()。
github.com/jmoiron/sqlx;包裝和使用的Db也用於github.com/go-gorp/gorp包裝。
github.com/astaxie/beego/orm包裝公司使用的Orm產品,詳見“型號Beego ORM”。
Gorm-由github.com/jinzhu/gorm軟件包使用,示例可在其文檔中找到:模型。
有效-由github.com/asaskevich/govalidator軟件包使用,示例可在項目頁面中找到。
數據存儲-由應用引擎/數據存儲(Google應用引擎平臺,數據存儲服務)使用,這在“屬性”中有詳細說明。
Schema-用於通過HTML表單值進行github.com/gorilla/schema填充(在結構包文檔中有詳細說明)。
Asn-由編碼/asn1打包和使用,在asn1中有詳細描述。Marshal()和asn1。解組()。
CSV-github.com/gocarina/gocsv包裝公司使用。