go中的dev和prod env的不同const值

use*_*038 4 go

例如,我正在开发留言簿.它允许添加需要由主持人批准的记录.但是在开发更多功能时,批准每条记录都会很痛苦,这是在测试期间添加的.那么,是否有可能构建使用适当的标志集创建此类记录的应用程序的开发版本?

例如,使用以下功能编译prod构建:

func NewRecord() Record {
    return Record{Moderation: Awaiting}
}
Run Code Online (Sandbox Code Playgroud)

在dev构建中编译:

func NewRecord() Record {
    return Record{Moderation: Approved}
}
Run Code Online (Sandbox Code Playgroud)

我知道在前端,当你构建一些JS应用程序时,通常的做法是在构建生产时设置NODE_ENV =生产环境变量.我在Go寻找类似的东西.我看到两种方式,但不喜欢它们中的任何一种:

  1. 我可以Awaiting = Approved在开发时设置,然后在构建prod版本时将其更改回实际值.但我害怕有一天我会忘记这个模拟,会把它变成回购或类似的东西.
  2. 将功能更改为类似的功能

    func NewRecord() Record {
        if os.Getenv(mykey) == "production" {
                return Record{Moderation: Awaiting}
        } else {
                return Record{Moderation: Approved}
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但是我不喜欢在运行时为每个新记录评估这个条件.对于编译语言来说,这似乎是错误的.

作为奖励,如果这样的应用程序可以显示警告(对stdout/stderr),如果它构建为开发版本,那将是很好的.

谢谢.

Sam*_*ted 5

就我个人而言,我认为在您的示例中使用环境变量是"正确"的方法.这允许您在不重建应用程序的情况下调整行为,这在调试时可能非常有用.但是,如果您确实希望在编译时完成此操作,则可以使用构建约束来完成.

构建的约束是放置在文件顶部的特殊注释,表示"仅在满足特定条件时才构建此文件".条件可以是我们正在构建的机器架构,我们正在运行的操作系统或用户在构建时指定的自定义构建标签.

例如,您可以将您的函数调整为:

func NewRecord() Record {
    return Record{Moderation: ModLevel}
}
Run Code Online (Sandbox Code Playgroud)

然后在一个modlevel_prod.go看起来像这样的文件中定义两次ModLevel :

// +build !dev

package mypackage

const ModLevel = Awaiting
Run Code Online (Sandbox Code Playgroud)

modlevel_dev.go(在这种情况下,文件名无关紧要)中的一个看起来像这样:

// +build dev

package mypackage

const ModLevel = Approved
Run Code Online (Sandbox Code Playgroud)

现在,在构建时,文件的生产版本是默认版本,如果要构建文件的开发版本,则必须显式包含构建标记:

$ go build -tags dev
Run Code Online (Sandbox Code Playgroud)