将GOLANG中的开发和生产环境分离

21

我是 GO 编程的新手。我之前主要使用 Node.js。在 Node.js 中,很容易区分开发模式和生产模式。只需使用以下代码即可。

if(process.env.NODE_ENV==="production"){
   server.listen(prod.port);
} 
else{
   server.listen(dev.port);
}

我基本上希望在GO中也能使用这个约定。那么如何分离我的开发和生产代码呢?

我想要这个特性的原因是:

在开发和生产环境中区分我的服务器监听的端口。

如果有任何技术可以分隔端口,那也可以。

P.S:我使用VScode作为我的代码编辑器,以及go-iris作为Go服务器框架。


4
最好不要这样做,因为会导致大量的重复。其实很少有必要像这样在不同的环境中切换,因此你只是一遍又一遍地编写相同的代码。只需使用一个环境就行了,将环境调整到适合代码,而不是调整代码来适应环境。 - Derek Pollard
特别是考虑到原生支持的大量开箱即用的开发工具,你真的没有必要编写环境重复代码。 - Derek Pollard
3个回答

17

在Go语言中,您有多种方法可以实现此目的,但所有这些方法都不能在代码本身中处理。

  1. 使用环境变量,例如os.Getenv
  2. 解析配置文件,例如某些.yaml文件
  3. 使用标志,例如package flag

我认为最常见的解决方案是使用标志,但所有方法都能完成相同的任务。通常情况下,您会在主函数中解析标志。


2
是的!这很理想。如果不是主要的话,那么肯定是init() - 特别是在解析不同包中的不同标志时。 - Derek Pollard
2
或者您可以手动按任意优先顺序使用所有三个,加上硬编码默认值,或者您可以使用类似 https://github.com/spf13/viper 的工具来自动完成。 - Adrian

14

将函数赋值给变量,例如 port:=os.Getenv("APP_ENV") 并不能起作用,但是当直接使用 if os.Getenv("APP_ENV")=="production"{ // } 时可以正常工作。 - Raju Adhikari
你能否粘贴一下使用 port 的代码部分? - whitespace
我没听懂你的意思,你是指类型转换(cast)还是过去式(past)? - Raju Adhikari
抱歉,我是说*粘贴。我不明白为什么“port”变量不能存储字符串值。如果您能展示代码中有问题的部分,我可能能够改进答案。 - whitespace
抱歉,那是 env 变量而不是 portenv:=os.Getenv("APP_ENV"); if env=="production"{ }else{ } - Raju Adhikari
如果 env := os.Getenv("APP_ENV"); env != "" { fmt.Println(os.Getenv("APP_ENV")) } 对我来说可行。 - whitespace

0
只需使用参数运行您的应用程序,例如go run main.go -mode development,默认模式为生产模式。您可以使用脚本启动应用程序以分离不同的环境。例如,您的bootstrap.bat文件可能如下所示:go run main.go -mode development

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接