使用带有编译的Go程序的配置文件

Arm*_*let 1 json config go

我有一个使用config.json文件的Go应用程序来获取一些信息.当go run main.go它做它的工作,但当我将应用程序编译成可执行文件时,我有错误open config.json: no such file or directory.

我的代码是:

func main() {
        data, err := ioutil.ReadFile("./config.json")
        check(err)

        var config config
        err = json.Unmarshal(data, &config)
        check(err)
}
Run Code Online (Sandbox Code Playgroud)

我也尝试了ioutil.ReadFile("config.json"),但它不起作用.check(err)并且config结构在main.go,问题不是来自这里.

main.go,config.json可执行文件位于同一目录中.

config.json编译程序后,如何才能使用该文件?

fl0*_*cke 7

您的配置文件可能不在您启动应用程序的工作目录中.但是硬编码文件的路径并不是最好的做法.

方法#1:命令行参数

使用该flag包将路径作为命令行标志传递给配置文件:

var filename = flag.String("config", "config.json", "Location of the config file.")

func main() {
        flag.Parse()
        data, err := ioutil.ReadFile(*filename)
        check(err)

        var config config
        err = json.Unmarshal(data, &config)
        check(err)
}
Run Code Online (Sandbox Code Playgroud)

使用./application -config=/path/to/config.json(取决于您的平台)启动应用程序.


方法#2:环境变量

使用该os包读取系统环境中的路径.

func main() {
        filename := os.Getenv("PATH_TO_CONFIG")
        if filename == "" {
          filename = "config.json"
        }

        data, err := ioutil.ReadFile(filename)
        check(err)

        var config config
        err = json.Unmarshal(data, &config)
        check(err)
}
Run Code Online (Sandbox Code Playgroud)

设置环境变量export PATH_TO_CONFIG=/path/to/config.json(取决于您的平台)并启动应用程序.

config.json如果没有为应用程序提供路径,这两种方法都将尝试在工作目录中查找.