前言
viper 支援Yaml、Json、 TOML、HCL 等格式,讀取非常的方便。
安裝
go get github.com/spf13/viper
如果提示找不到golang.org/x/text/這個函式庫,是因為golang.org/x/text/這個函式庫在GitHub上託管的路徑不一致。
解決方法:
可從https://github.com/golang/text下載原始碼下來,然後到$GOPATH/src下面建立golang.org/x/資料夾(已存在的忽略),把壓縮包的檔案解壓縮到golang.org/x/資料夾之下。
接著執行 go install -x golang.org/x/text 即可解決:
##正文
# 正文初始結構目錄如下:
準備測試中使用的yaml文件,注意yaml的格式十分嚴格,主要是每個冒號後面必須要有空格,數組前要加“-”號表示連續(注意減號後面也有空格),內容如下:
TimeStamp: "2018-10-18 10:09:23" Address: "Shenzhen" Postcode: 518000 CompanyInfomation: Name: "Sunny" MarketCapitalization: 50000000 EmployeeNum: 200 Department: - "Finance" - "Design" - "Program" - "Sales" IsOpen: false讀取yaml檔案:
package main import ( "github.com/spf13/viper" "fmt" ) func main() { //读取yaml文件 v := viper.New() //设置读取的配置文件 v.SetConfigName("linux_config") //添加读取的配置文件路径 v.AddConfigPath("./config/") //windows环境下为%GOPATH,linux环境下为$GOPATH v.AddConfigPath("$GOPATH/src/") //设置配置文件类型 v.SetConfigType("yaml") if err := v.ReadInConfig();err != nil { fmt.Printf("err:%s\n",err) } fmt.Printf( ` TimeStamp:%s CompanyInfomation.Name:%s CompanyInfomation.Department:%s `, v.Get("TimeStamp"), v.Get("CompanyInfomation.Name"), v.Get("CompanyInfomation.Department"), ) /* result: TimeStamp:2018-10-18 10:09:23 CompanyInfomation.Name:Sunny CompanyInfomation.Department:[Finance Design Program Sales] */ }也可以直接反序列化為Struct,非常的方便:
# package main
import (
"github.com/spf13/viper"
"fmt"
)
func main() {
//读取yaml文件
v := viper.New()
//设置读取的配置文件
v.SetConfigName("linux_config")
//添加读取的配置文件路径
v.AddConfigPath("./config/")
//windows环境下为%GOPATH,linux环境下为$GOPATH
v.AddConfigPath("$GOPATH/src/")
//设置配置文件类型
v.SetConfigType("yaml")
if err := v.ReadInConfig();err != nil {
fmt.Printf("err:%s\n",err)
}
fmt.Printf(
`
TimeStamp:%s
CompanyInfomation.Name:%s
CompanyInfomation.Department:%s `,
v.Get("TimeStamp"),
v.Get("CompanyInfomation.Name"),
v.Get("CompanyInfomation.Department"),
)
/*
result:
TimeStamp:2018-10-18 10:09:23
CompanyInfomation.Name:Sunny
CompanyInfomation.Department:[Finance Design Program Sales]
*/
//反序列化
parseYaml(v)
}
type CompanyInfomation struct{
Name string
MarketCapitalization int64
EmployeeNum int64
Department []interface{}
IsOpen bool
}
type YamlSetting struct{
TimeStamp string
Address string
Postcode int64
CompanyInfomation CompanyInfomation
}
func parseYaml(v *viper.Viper){
var yamlObj YamlSetting;
if err := v.Unmarshal(&yamlObj) ; err != nil{
fmt.Printf("err:%s",err)
}
fmt.Println(yamlObj)
/*
result:
{2018-10-18 10:09:23 Shenzhen 518000 {Sunny 50000000 200 [Finance Design Program Sales] false}}
*/
}
viper也提供了讀取Command Line參數的功能:package main
import (
"github.com/spf13/pflag"
"github.com/spf13/viper"
"fmt"
)
func main() {
pflag.String("hostAddress", "127.0.0.1", "Server running address")
pflag.Int64("port", 8080, "Server running port")
pflag.Parse()
viper.BindPFlags(pflag.CommandLine)
fmt.Printf("hostAddress :%s , port:%s", viper.GetString("hostAddress"), viper.GetString("port"))
/*
example:
go run main2.go --hostAddress=192.192.1.10 --port=9000
help:
Usage of /tmp/go-build183981952/b001/exe/main:
--hostAddress string Server running address (default "127.0.0.1")
--port int Server running port (default 8080)
*/
}
很多時候,我們伺服器啟動之後,如果臨時想修改某些設定參數,則需要重啟伺服器才能生效,但是viper提供了監聽函數,可以免重啟修改設定參數,非常的實用:package main import ( "github.com/spf13/viper" "fmt" "golang.org/x/net/context" "github.com/fsnotify/fsnotify" ) func main() { //读取yaml文件 v := viper.New() //设置读取的配置文件 v.SetConfigName("linux_config") //添加读取的配置文件路径 v.AddConfigPath("./config/") //windows环境下为%GOPATH,linux环境下为$GOPATH v.AddConfigPath("$GOPATH/src/") //设置配置文件类型 v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { fmt.Printf("err:%s\n", err) } //创建一个信道等待关闭(模拟服务器环境) ctx, _ := context.WithCancel(context.Background()) //cancel可以关闭信道 //ctx, cancel := context.WithCancel(context.Background()) //设置监听回调函数 v.OnConfigChange(func(e fsnotify.Event) { fmt.Printf("config is change :%s \n", e.String()) //cancel() }) //开始监听 v.WatchConfig() //信道不会主动关闭,可以主动调用cancel关闭 <-ctx.Done() /* result: config is change :"/home/share/go/Viper/config/linux_config.yaml": CREATE config is change :"/home/share/go/Viper/config/linux_config.yaml": CREATE */ }
完結 viper還有許多好用的功能,這篇文章只是舉例說明了很小的部分,歡迎留言,多提提意見,感謝大家。
更多golang相關技術文章,請造訪golang#######教學欄位! ###### ###以上是分享Golang中一個好用的viper配置模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。

Golang和C 在執行效率上的表現各有優勢。 1)Golang通過goroutine和垃圾回收提高效率,但可能引入暫停時間。 2)C 通過手動內存管理和優化實現高性能,但開發者需處理內存洩漏等問題。選擇時需考慮項目需求和團隊技術棧。

Golang更適合高並發任務,而Python在靈活性上更有優勢。 1.Golang通過goroutine和channel高效處理並發。 2.Python依賴threading和asyncio,受GIL影響,但提供多種並發方式。選擇應基於具體需求。

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

selectgolangforhighpperformanceandcorrency,ifealforBackendServicesSandNetwork程序; selectpypypythonforrapiddevelopment,dataScience和machinelearningDuetoitsverserverserverserversator versator anderticality andextility andextentensivelibraries。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器