Go struct:在struct标签中使用变量

时间:2015-04-20 15:46:02

标签: json go

我如何在Go结构标记中使用变量?

这有效:

type Shape struct {
    Type string `json:"type"`
}

这不起作用:

const (
    TYPE = "type"
)

type Shape struct {
    Type string fmt.Sprintf("json:\"%s\"", TYPE)
}

在第一个例子中,我使用的是字符串文字,它可以正常工作。在第二个示例中,我使用fmt.Sprintf构建一个字符串,我似乎收到一个错误: syntax error: unexpected name, expecting }

这是在Go游乐场: https://play.golang.org/p/lUmylztaFg

3 个答案:

答案 0 :(得分:4)

如何在Go结构标记中使用变量?你不会,语言不允许这样做。您不能使用在运行时求值的语句代替编译时字符串文字作为结构上字段的注释。据我所知,任何编译语言中的排序都不起作用。

答案 1 :(得分:2)

随着go generate的推出,有可能实现这一目标。

然而,go generate本质上使编译成为一个两阶段的过程。阶段1生成新代码,阶段2编译和链接等。

使用go generate有一些限制:

  1. 除非您每次需要时都运行go generate并检查结果,否则您的图书馆将无法获取,因为go generate需要先显式运行go build
  2. 这是一个编译时进程,因此您无法在运行时使用运行时信息执行此操作。如果你真的必须在运行时这样做,在你的情况下,你只是添加JSON序列化注释,你可以考虑使用地图。

答案 2 :(得分:0)

标记值to keep things simple中不允许使用字符串const / variable,我支持。但是,由于这个限制,我们需要使用 reflection 来检索标记值,该标记值在项目中随处可见的 OR 类型字符串文字可能很昂贵由于错别字导致错误。

解决方案

我们可以将标记值生成为字符串常量,然后在项目中进一步使用此常量。它不使用反射(节省性能成本),更易于维护,并且消除了由于错别字引起的任何错误。

ast软件包是一个出色的工具,可以分析和生成go代码。例如-

type user struct {
    Name string `json:"name"`
    Age int `json:"age"`
}

我们可以为user结构生成常量,如下所示-

const (
    UserNameJson = "name"
    UserAgeJson  = "age"
)

您可能会发现tgcon有助于将字段标签值生成为const。