本篇将介绍如何处理应用程序的可选配置,并在具有文件配置的实际案例中使用功能选项模式。
带功能选项的文件配置
Golang 版本
1.12.1
前言
本篇将介绍如何处理应用程序的可选配置,并在具有文件配置的实际案例中使用功能选项模式。
实现
创建文件main.go
,代码如下:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Client struct {
consulIP string
connString string
}
func (c *Client) String() string {
return fmt.Sprintf("ConsulIP:%s,connString:%s", c.consulIP, c.connString)
}
var defaultClient = Client{
consulIP: "localhost:9000",
connString: "postgres://localhost:5432",
}
// ConfigFunc用作要在功能选项中使用的类型
type ConfigFunc func(opt *Client)
// FromFile func返回ConfigFunc类型。这样它就可以从json读取配置
func FromFile(path string) ConfigFunc {
return func(opt *Client) {
f, err := os.Open(path)
if err != nil {
panic(err)
}
defer f.Close()
decoder := json.NewDecoder(f)
fop := struct {
ConsulIP string `json:"consul_ip"`
}{}
err = decoder.Decode(&fop)
if err != nil {
panic(err)
}
opt.consulIP = fop.ConsulIP
}
}
// FromEnv从环境变量读取配置并将它们与现有变量组合
func FromEnv() ConfigFunc {
return func(opt *Client) {
connStr, exist := os.LookupEnv("CONN_DB")
if exist {
opt.connString = connStr
}
}
}
func NewClient(opts ...ConfigFunc) *Client {
client := defaultClient
for _, val := range opts {
val(&client)
}
return &client
}
func main() {
client := NewClient(FromFile("config.json"), FromEnv())
fmt.Println(client.String())
}
创建文件config.json
,内容如下:
{
"consul_ip":"127.0.0.1"
}
$ export CONN_DB=oracle://local:5921 && go run main.go
ConsulIP:127.0.0.1,connString:oracle://local:5921
原理
函数选项模式的核心概念是配置API包含函数参数。在本例中,NewClient
函数接受不同数量的ConfigFunc
参数,然后在defaultClient
结构上逐一应用这些参数。通过这种方式,可以非常灵活地修改默认配置。
请参阅FromFile
和FromEnv
函数,它们返回ConfigFunc
,实际上是访问文件或环境变量。
最后,可以检查输出,其中包含来自文件和环境变量的值。