Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
go中dev和prod env的const值不同_Go - Fatal编程技术网

go中dev和prod env的const值不同

go中dev和prod env的const值不同,go,Go,例如,我正在开发留言簿。它允许添加需要版主批准的记录。但在开发进一步的功能时,批准在测试期间添加的每个记录是一件痛苦的事情。 那个么,是否有可能构建应用程序的开发版本,用适当的标志集创建这样的记录呢 例如,prod build使用以下功能编译: func NewRecord() Record { return Record{Moderation: Awaiting} } 在开发版本中,编译时使用: func NewRecord() Record { return Record{

例如,我正在开发留言簿。它允许添加需要版主批准的记录。但在开发进一步的功能时,批准在测试期间添加的每个记录是一件痛苦的事情。 那个么,是否有可能构建应用程序的开发版本,用适当的标志集创建这样的记录呢

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

func NewRecord() Record {
    return Record{Moderation: Awaiting}
}
在开发版本中,编译时使用:

func NewRecord() Record {
    return Record{Moderation: Approved}
}
我知道在前端,当您构建一些JS应用程序时,在构建用于生产的应用程序时设置NODE_ENV=production环境变量是一种常见的做法。 我正在围棋中寻找类似的东西。 我有两种看法,但我不喜欢其中任何一种:

  • 我可以在开发时设置
    waiting=Approved
    ,然后在构建prod版本时将其更改回实际值。但我担心有一天我会忘记这个模拟,将其提交回购或类似的东西
  • 将函数更改为

    func NewRecord() Record {
        if os.Getenv(mykey) == "production" {
                return Record{Moderation: Awaiting}
        } else {
                return Record{Moderation: Approved}
        }
    }
    
    但我不喜欢在运行时为每个新记录计算这个条件。对于编译语言来说,这似乎是错误的

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


    谢谢。

    我个人认为,使用您在示例中使用的环境变量是实现这一点的“正确”方法。这允许您在不重建应用程序的情况下调整行为,这在调试时可能非常有用。然而,如果您真的希望在编译时完成这项工作,则可以使用

    构建约束是放置在文件顶部的一条特殊注释,上面写着“仅在满足特定条件时构建此文件”。条件可以是我们正在构建的机器体系结构、我们正在运行的操作系统或用户在构建时指定的自定义构建标记

    例如,您可以将函数调整为以下内容:

    func NewRecord() Record {
        return Record{Moderation: ModLevel}
    }
    
    然后定义ModLevel两次,一次在文件
    ModLevel\u prod.go
    中,如下所示:

    // +build !dev
    
    package mypackage
    
    const ModLevel = Awaiting
    
    // +build dev
    
    package mypackage
    
    const ModLevel = Approved
    
    以及
    modlevel\u dev.go
    中的一个(或者,在本例中,文件名并不重要)如下所示:

    // +build !dev
    
    package mypackage
    
    const ModLevel = Awaiting
    
    // +build dev
    
    package mypackage
    
    const ModLevel = Approved
    
    现在,在构建时,文件的生产版本是默认版本,如果要构建文件的开发版本,则必须显式包含build标记:

    $ go build -tags dev
    

    在以下位置对表达式求值一次:


    谢谢关于“正确性”,我还没有过时的意见。也许你是对的。虽然这个答案解决了前面提到的问题,但我在这个问题上支持@mellow marmot:这些东西应该保持可配置性——也就是说,在启动时从一些配置文件和/或环境中提取,谢谢。一、 事实上,我将使用这种方法,但有标记的答案描述了如何在被问到问题时实现我想要的。