在开发系统的过程中,将 数据库连接
、环境设置
等参数抽离出来变成 设置档
是必须的事情,让我们开发的程序可以在不同的环境中只要修改设置档就可以运行。
今天就让我们来聊聊如何轻松的管理设置档吧!
设置档可能会有很多不同的类型,常见的有
在开发时可以选择其中一种格式,我本人是偏好使用 yaml
格式,以下为范例
application:
timeout:
read: 1000
write: 1000
port: 8080
uploadPath: "./upload"
mode: "debug"
appId: "go"
apiBaseRoute: "/api"
那么,要怎么使用 golang 读取到这份 yaml 档呢,我推荐使用 viper
这个 open source 的 package
viper 的网址:https://github.com/spf13/viper
首先我们先来看看 viper 可以帮我们做到哪些事
viper 是一种管理设置档的解决方案,它具有以下几种特性
etcd
或是 consul
到这边我们大概理解了 viper
可以帮我们解决大多数在处理设置档上的问题后,就让我们开始使用它吧!
可以通过 go get
的方式轻松的安装
go get github.com/spf13/viper
首先我们先准备一份设置档并放到根目录底下的 config
文件夹,名称定为 app.yaml
application:
timeout:
read: 1000
write: 1000
port: 8080
uploadPath: "./upload"
mode: "debug"
appId: "go"
apiBaseRoute: "/api"
通过 import
指令将 viper
进行导入
import "github.com/spf13/viper"
刚才我们将设置档定为 app.yaml
,所以我们可以通过 SetConfigName
的方法将 app
设置进去
viper.SetConfigName("config")
由于我们要读取的是 yaml
格式的文件,因此通过 SetConfigType
将 yaml
进行标示
viper.SetConfigType("yaml")
接着我们就是设置设置档的位置,由于我们是放在 config
文件夹底下,因此可以通过 AddConfigPath
将 ./config
设置上去
viper.AddConfigPath("./config")
某些参数如果没有填写可能会造成程序运行出现错误,因此我们可以通过 SetDefault
将特定参数设置默认值
viper.SetDefault("application.port", 8080)
接着我们可以通过 ReadInConfig
让 viper
利用上面的设置来读取我们要的设置档,他会回传 error
,如果读取的时候出错,error 就不会为 nil,因此我们要加上错误判断
err := viper.ReadInConfig()
if err != nil {
panic("读取设置档出现错误,原因为:" + err.Errror())
}
最后我们可以通过 Get
的方式读取我们要访问的参数,参数的阶层可以使用 .
来间隔,以 app.yaml
为例,我们想要读取 application
底下的 port
参数值,我们就可以把 key 写成 application.port
来读取
viper.Get("application.port")
将以上程序综合起来如下
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigName("app")
viper.SetConfigType("yaml")
viper.AddConfigPath("./config")
viper.SetDefault("application.port", 8080)
err := viper.ReadInConfig()
if err != nil {
panic("读取设置档出现错误,原因为:" + err.Error())
}
fmt.Println("application port = " + viper.GetString("application.port"))
}
运行完毕之后如果结果出现 application port = 8080
就代表成功读取设置档拉!
以往在处理设置档真的是要花费很大量的时间在处理格式与结构,但在使用 viper 之后让我考试都考一百分!极度推荐给大家使用!