栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Go中标签的用途是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go中标签的用途是什么?

字段标签允许您将元信息附加到可以使用反射获取的字段上。通常,它用于提供有关如何将结构域编码为另一种格式(或从另一种格式存储(或从数据库中检索))的转换信息,但是您可以使用它存储想要存储的任何元信息,这些元信息既可以用于另一种包装或供您自己使用。

如的文档所述

reflect.StructTag
,按照惯例,标记字符串的值是用空格分隔的
key:"value"
成对列表,例如:

type User struct {    Name string `json:"name" xml:"name"`}

key
通常表示包,随后的
"value"
是,例如
json
密钥被处理/使用的
encoding/json
包。

如果要在中传递多个信息

"value"
,通常通过用逗号(
','
)隔开来指定它,例如

Name string `json:"name,omitempty" xml:"name"`

通常用破折号(

'-'
"value"
表示将字段从过程中排除(例如,在这种情况下,
json
表示不封送或取消封送该字段)。

使用反射访问自定义标签的示例

我们可以使用反射(

reflect
包)来访问结构字段的标记值。基本上,我们需要获取
Type
结构的,然后可以使用
Type.Field(iint)
或查询字段
Type.FieldByName(namestring)
。这些方法返回的值
StructField
描述/表示一个struct字段;并且
StructField.Tag
StructTag
描述/表示标记值的类型值。

以前我们谈论过 “惯例” 。该公约的手段,如果你遵循它,你可以使用

StructTag.Get(keystring)
它解析变量的值,并返回该方法
"value"
key
指定。该
公约
实施/内置到这个
Get()
方法。如果您不遵守约定,
Get()
将无法解析
key:"value"
对并找到您要查找的内容。这也不是问题,但是随后您需要实现自己的解析逻辑。

还有

StructTag.Lookup()
(在Go
1.7中添加了),它 “类似于,
Get()
但是将不包含给定键的标签与将空字符串与给定键相关联的标签区分开”

因此,让我们看一个简单的示例:

type User struct {    Name  string `mytag:"MyName"`    Email string `mytag:"MyEmail"`}u := User{"Bob", "bob@mycompany.com"}t := reflect.TypeOf(u)for _, fieldName := range []string{"Name", "Email"} {    field, found := t.FieldByName(fieldName)    if !found {        continue    }    fmt.Printf("nField: User.%sn", fieldName)    fmt.Printf("tWhole tag value : %qn", field.Tag)    fmt.Printf("tValue of 'mytag': %qn", field.Tag.Get("mytag"))}

输出(在Go Playground上尝试):

Field: User.Name    Whole tag value : "mytag:"MyName""    Value of 'mytag': "MyName"Field: User.Email    Whole tag value : "mytag:"MyEmail""    Value of 'mytag': "MyEmail"

GopherCon 2015上有一个关于struct标签的演示,名为:

结构标签的许多面孔(幻灯片)
(和视频)

以下是常用标签键的列表:

  • json
    -由
    encoding/json
    包装使用,详细说明
    json.Marshal()
  • xml
    -由
    encoding/xml
    包装使用,详细说明
    xml.Marshal()
  • bson
    -由gobson使用,详细说明
    bson.Marshal()
  • protobuf
    -由
    github.com/golang/protobuf/proto
    ,在软件包doc中有详细说明
  • yaml
    -由
    gopkg.in/yaml.v2
    包装使用,详细说明
    yaml.Marshal()
  • db
    -由
    github.com/jmoiron/sqlx
    包装使用;也被
    github.com/go-gorp/gorp
    包装使用
  • orm
    -由
    github.com/astaxie/beego/orm
    包装使用,在“ 型号– Beego ORM”中有详细说明
  • gorm
    -由
    github.com/jinzhu/gorm
    软件包使用,示例可在其文档中找到:模型
  • valid
    -由
    github.com/asaskevich/govalidator
    软件包使用,示例可以在项目页面中找到
  • datastore
    -由
    appengine/datastore
    (Google App Engine平台,数据存储区服务)使用,在“ 属性”中有详细说明
  • schema
    -用于通过HTML表单值
    github.com/gorilla/schema
    填充(
    struct
    包文档中有详细说明)
  • asn
    -由
    encoding/asn1
    包装使用,详细说明在
    asn1.Marshal()
    asn1.Unmarshal()
  • csv
    -由
    github.com/gocarina/gocsv
    包装使用


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373068.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号