iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Modern Web

Go into Web!系列 第 9

Day9 | 輕鬆管理程式的設定檔

在開發系統的過程中,將 資料庫連線環境設定 等參數抽離出來變成 設定檔 是必須的事情,讓我們開發的程式可以在不同的環境中只要修改設定檔就可以運行。

今天就讓我們來聊聊如何輕鬆的管理設定檔吧!

設定檔

設定檔可能會有很多不同的類型,常見的有

  • json
  • yaml
  • ini
  • toml
  • properties

在開發時可以選擇其中一種格式,我本人是偏好使用 yaml 格式,以下為範例

application:
  timeout:
    read: 1000
    write: 1000
  port: 8080
  uploadPath: "./upload"
  mode: "debug"
  appId: "go"
  apiBaseRoute: "/api"

那麼,要怎麼使用 golang 讀取到這份 yaml 檔呢,我推薦使用 viper 這個 open source 的 package

viper 是什麼

viper 的網址:https://github.com/spf13/viper
首先我們先來看看 viper 可以幫我們做到哪些事

viper 是一種管理設定檔的解決方案,它具有以下幾種特性

  • 支援 JSON, TOML, YAML, HCL, envfile, properties 等格式的設定文件
  • 可以設定要 listen 哪份設定文件進行熱加載
  • 可以從環境變數中讀取參數
  • 支援從遠端系統讀取設定,例如 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"

匯入相依 package

透過 import 指令將 viper 進行匯入

import "github.com/spf13/viper"

設定

要讀取的檔名

剛才我們將設定檔定為 app.yaml,所以我們可以透過 SetConfigName 的方法將 app 設定進去

viper.SetConfigName("config")

要讀取的附檔名

由於我們要讀取的是 yaml 格式的檔案,因此透過 SetConfigTypeyaml 進行標示

viper.SetConfigType("yaml")

要讀取的路徑

接著我們就是設定設定檔的位置,由於我們是放在 config 資料夾底下,因此可以透過 AddConfigPath./config 設定上去

viper.AddConfigPath("./config")

設定參數預設值

某些參數如果沒有填寫可能會造成程式運行出現錯誤,因此我們可以透過 SetDefault 將特定參數設定預設值

viper.SetDefault("application.port", 8080)

讀取設定檔

接著我們可以透過 ReadInConfigviper 利用上面的設定來讀取我們要的設定檔,他會回傳 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 之後讓我考試都考一百分!極度推薦給大家使用!

參考


上一篇
Day8 | 使用 ORM 與資料庫進行互動
下一篇
Day10 | 讓我們的 Go 更國際化 - i18n 的應用
系列文
Go into Web!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
raymond0519
iT邦新手 5 級 ‧ 2021-11-08 13:59:59

go get github.com/spf13/viper

C:\Program Files\Go\src\github.com\hashicorp\hcl\hcl\printer (from $GOROOT)
C:\Users\RaymondHe\go\src\github.com\hashicorp\hcl\hcl\printer (from $GOPATH)

go version
go version go1.17.3 windows/amd64

想請問這個問題要怎麼解決呢?

阿翔 iT邦新手 4 級 ‧ 2021-11-15 14:37:14 檢舉

golang package 路徑的問題可以使用 go mod 解決,可以參考這篇
https://medium.com/%E5%BE%AE%E5%B3%AF%E9%A3%9B%E7%BF%94/golang-go-mod-%E8%B5%B7%E6%89%8B%E5%8B%A2-39a0be969ffc

我要留言

立即登入留言