在 Go Language Specification 中,提到了标签的简要概述:
字段声明后面可以跟一个可选的字符串文字标记,它成为相应字段声明中所有字段的属性。标签通过反射接口可见,否则会被忽略。
// A struct corresponding to the TimeStamp protocol buffer. // The tag strings define the protocol buffer field numbers. struct { microsec uint64 "field 1" serverIP6 uint64 "field 2" process string "field 3" }
这是 IMO 的一个非常简短的解释,我想知道是否有人可以向我提供这些标签的用途?
原文由 liamzebedee 发布,翻译遵循 CC BY-SA 4.0 许可协议
字段的标记允许您将元信息附加到可以使用反射获取的字段。通常它用于提供有关如何将结构字段编码为另一种格式或从另一种格式解码(或从数据库中存储/检索)的转换信息,但您可以使用它来存储您想要的任何元信息,或者用于另一个包装或供您自己使用。
正如
reflect.StructTag
的文档中所述,按照惯例,标记字符串的值是key:"value"
对的空格分隔列表,例如:The
key
usually denotes the package that the subsequent"value"
is for, for examplejson
keys are processed/used by theencoding/json
package.如果要在
"value"
中传递多个信息,通常用逗号分隔指定(','
),例如通常, --- 的短划线值 (
'-'
"value"
意味着从流程中排除该字段(例如,在json
的情况下,它意味着 unmar 或 notbe mar–场地)。使用反射访问自定义标签的示例
我们可以使用反射(
reflect
包)来访问结构字段的标签值。基本上我们需要获取我们结构的Type
,然后我们可以查询字段,例如Type.Field(i int)
或Type.FieldByName(name string)
。这些方法返回一个值StructField
描述/代表一个结构字段;和StructField.Tag
是类型 [StructTag
] 6 的值,它描述/表示标签值。之前我们谈到了 “约定” 。这个约定意味着如果你遵循它,你可以使用
StructTag.Get(key string)
方法解析标签的值并返回你指定的"value"
的key
.该 约定 已实现/内置到此Get()
方法中。如果您不遵循约定,Get()
将无法解析key:"value"
对并找到您要查找的内容。这也不是问题,但是您需要实现自己的解析逻辑。还有
StructTag.Lookup()
(在 Go 1.7 中添加) “类似于Get()
但将不包含给定键的标签与将空字符串与给定键相关联的标签区分开来” 。那么让我们看一个简单的例子:
输出(在 Go Playground 上尝试):
GopherCon 2015 有一个关于结构标签的演示文稿,名为:
结构标签的多面性(幻灯片) (和 视频)
以下是常用标签键的列表:
json
- 由encoding/json
包使用,详见json.Marshal()
xml
- 由encoding/xml
包使用,详见xml.Marshal()
bson
- 由 gobson 使用,详见bson.Marshal()
;也由 mongo-go 驱动程序提供,详见 bson package docprotobuf
- 由github.com/golang/protobuf/proto
使用,在包文档中有详细说明yaml
- 由gopkg.in/yaml.v2
包使用,详见yaml.Marshal()
db
- 被github.com/jmoiron/sqlx
包使用;也被github.com/go-gorp/gorp
包使用orm
- 由github.com/astaxie/beego/orm
包使用,详见 模型 – Beego ORMgorm
- 由gorm.io/gorm
使用,例子可以在他们的 文档 中找到valid
- 由github.com/asaskevich/govalidator
包使用,示例可以在项目页面中找到datastore
- 由appengine/datastore
(Google App Engine 平台,数据存储服务)使用,详见 属性schema
- 由github.com/gorilla/schema
使用 --- 填充struct
使用 HTML 表单值,在包文档中有详细说明asn
asn1.Marshal()
encoding/asn1
asn1.Unmarshal()
csv
- 被github.com/gocarina/gocsv
包使用env
- 被github.com/caarlos0/env
包使用