如何在 Golang 中优雅地制作配置文件



我是Golang的新手。我想编写一个程序来管理我的 Redis 实例,以便可以使用特定配置文件创建 Redis 连接。但是我不知道如何优雅地为 Redis 实例创建配置文件。

我之前发现过"文本/模板",这是个好主意吗?

这取决于您希望为这些配置支持的文件格式。

一个能够读取大多数格式(从简单的 ini 文件到 JSON 文件)的库将是 spf13/viper

Viper 是适用于 Go 应用程序的完整配置解决方案。它被设计为在应用程序中工作以处理所有类型的配置。它支持

  • 设置默认值
  • 从 YAML、Toml 和 JSON 配置文件中读取
  • 从环境变量读取
  • 从远程配置系统(Etcd 或 Consul)读取数据
  • 从命令行标志读取
  • 设置显式值

Redis 配置文件具有简单的文本格式。您可以使用 fmt 软件包生成配置文件:

fmt.Fprintf(w, "pidfile %sn", pidFile)
fmt.Fprintf(w, "port %dn", port)

其中w为输出io.Writer

文本/模板包也是一个可行的选择。给定模板

pidfile {{.PidFile}}
port {{.Port}}

你可以用

t.Execute(w, map[string]interface{}{
   "PidFile": pidFile,
   "Port": port,
})
如果你想

为开发、测试、暂存和生产制作一个配置文件,我建议使用 Go 提供的// +build可能性。


设置您的 Go 程序

您可以在config包中创建 4 个文件,如下所示:

src/program/config
               |
               |--config_dev.go
               |--config_test.go
               |--config_staging.go
               |--config_prod.go

在配置文件中

然后,在每个文件中,定义用于在go build(或运行...)过程中使用该文件的标记。

这意味着例如在 config_dev.go 中:

// +build dev
package config
// Development ready configuration const based on the build tags.
const (
    MYSETTINGS = "dev blablabla"
    ISREADY    = false
)

config_test.go 中,这看起来像:

// +build test
package config
// Development ready configuration const based on the build tags.
const (
    MYSETTINGS = "test blablabla"
    ISREADY    = true
)

请注意// +build dev// +build test

这些是您将在构建过程中使用的标记,以告知要使用的配置文件。

在任何其他 Go 文件中,您只需调用config.ISREADY而无需导入文件中"config"的任何其他内容。


然后要构建您的应用程序,您只需运行:

使用开发配置构建go build -tags dev

go build -tags test使用测试配置进行构建。

由于 redis 配置文件的结构非常简单,我建议您查看将 Reader.Comma 分隔符设置为空格的编码/csv 包。它使您可以轻松读取,解析和写入配置。在我看来"奴隶{{。Host}} {{.端口}}"作为模板看起来不是很方便。但这肯定是正确的方法。只是品味问题。

我建议使用一些配置库。我喜欢蝰蛇,因为完整性。

最新更新