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

时间:2015-11-08 17:50:25

标签: go

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

你如何在Go中做到这一点?

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

1 个答案:

答案 0 :(得分:7)

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

引自博客文章Godoc: documenting Go code

  

该软件包对需要大量介绍性文档的软件包使用另一种约定:软件包注释放在其自己的文件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
)

元数据的元数据

如果您包含与日期或时间相关的常量(例如我的示例中的ReleaseDate),那么提供{{3>}可以使用的布局通常很有用。用于将string日期/时间转换为值time.Parse()的函数。对于上面的示例,它可能如下所示:

const ReleaseDateLayout = "2006-01-02" // Release date layout (for time.Parse())

使用此布局,获取time.Time

releaseDate, err := time.Parse(ReleaseDateLayout, ReleaseDate)

另一种选择是提供导出的实用程序功能,这些功能处理元数据并提供有关它们的其他信息或以其他格式显示它们。例如:

// 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
}

一个用于Version

// 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
}

私有元数据

导出这些常量,因此可以从导入和使用它的其他包中访问它们。如果您不想这样做,只需用小写字母开头,这样就无法通过"外部" (它们不会被导出),例如:

// This constant will not be in godoc and is unreachable from other packages
const codeReviewer = "Jane Small" // Last code reviewer: first name - last name