是否有向Go项目添加元数据的通用方法?

是否有向Go项目添加元数据的通用方法?,go,Go,在Node.js中,有一个package.json文件,其中包含模块上的多个元数据,例如其名称、版本、作者等 你在围棋中是怎么做到的 例如,我想用代码将Go模块的作者存储在某个地方。有没有一种常见的方法可以做到这一点?如果一个Go包有大量的文档,按照惯例,它应该放在自己的文件中,doc.Go 引用博文: 对于需要大量介绍性文档的包,该包使用了另一种约定:包注释放在自己的文件doc.go中,该文件仅包含这些注释和包子句 您可以在包文档本身中放置任何元数据 如果您希望这些“元数据”也可以从代码中获得

在Node.js中,有一个
package.json
文件,其中包含模块上的多个元数据,例如其名称、版本、作者等

你在围棋中是怎么做到的


例如,我想用代码将Go模块的作者存储在某个地方。有没有一种常见的方法可以做到这一点?

如果一个Go包有大量的文档,按照惯例,它应该放在自己的文件中,
doc.Go

引用博文:

对于需要大量介绍性文档的包,该包使用了另一种约定:包注释放在自己的文件doc.go中,该文件仅包含这些注释和包子句

您可以在包文档本身中放置任何元数据

如果您希望这些“元数据”也可以从代码中获得,您可以将它们存储在常量中,例如:

const (
    Author      = "Joe Big"
    Version     = "0.1.2.3"
    ReleaseDate = "2015-11-08"
)
请注意,导出的常量也将包含在godoc中,此外它们也可以从代码中获得

您也可以对行进行注释,注释也将包含在godoc中。这些评论可以让人清楚地知道它们是什么,例如:

const (
    Author      = "Joe Big"    // Package author: first name - last name
    Version     = "0.1.2.3"    // Package version: major.minor.maintenance.revision
    ReleaseDate = "2015-11-08" // Release date: year-month-day
)
// GetReleaseDate returns the release date as a value of time.Time.
func GetReleaseDate() time.Time {
    t, err := time.Parse(ReleaseDateLayout, ReleaseDate)
    if err != nil {
        panic(err)
    }
    return t
}
元数据的元数据 如果包含与日期或时间相关的常量(如我的示例中的
ReleaseDate
),则通常还可以提供一个布局,该布局可由函数用于将
字符串
日期/时间转换为值。对于上面的示例,它可能如下所示:

const ReleaseDateLayout = "2006-01-02" // Release date layout (for time.Parse())
使用此布局,获取一个
time.time

releaseDate, err := time.Parse(ReleaseDateLayout, ReleaseDate)
另一个选项是提供导出的实用程序函数,这些函数处理元数据并提供有关元数据的其他信息,或者以其他格式显示元数据。例如:

const (
    Author      = "Joe Big"    // Package author: first name - last name
    Version     = "0.1.2.3"    // Package version: major.minor.maintenance.revision
    ReleaseDate = "2015-11-08" // Release date: year-month-day
)
// GetReleaseDate returns the release date as a value of time.Time.
func GetReleaseDate() time.Time {
    t, err := time.Parse(ReleaseDateLayout, ReleaseDate)
    if err != nil {
        panic(err)
    }
    return t
}
一个用于
版本

// GetVersion returns the parts of the Version as a slice:
//     {major, minor, maintenance, revision}
func GetVersion() []int {
    vs := []int{}
    for _, s := range strings.Split(Version, ".") {
        if v, err := strconv.Atoi(s); err != nil {
            panic(err)
        } else {
            vs = append(vs, v)
        }
    }
    return vs
}
私有元数据 这些常量是导出的,因此可以从导入和使用该常量的其他包中访问它们。如果您不想这样做,请以小写字母开头,这样就无法从“外部”访问它们(不会导出),例如:


谢谢你详细的回答:-)。这些钥匙有什么推荐的名字吗?例如,是否有人指定它必须是
ReleaseDate
,或者这只是个人风格?@GoloRoden我不知道有什么建议,这只是个人风格。它们应该被命名为一些明显的名称,因此如果有人阅读包文档(其中也包含导出的常量),他们应该立即与它们是什么关联。评论这些台词也有助于大展拳脚。请参见编辑。@GoloRoden还添加了“元数据的元数据”部分。