Golang解析yaml文件的方法小結(jié)
yaml 文件是目前最常用的配置文件,使用go語(yǔ)言編寫代碼和工具時(shí),也會(huì)用到y(tǒng)aml文件,將服務(wù)配置及中間件等信息定義到y(tǒng)aml文件中,后續(xù)可根據(jù)實(shí)際場(chǎng)景來(lái)選用。
//先下載外部包 go get -u gopkg.in/yaml.v2
1、定義yaml配置文件
conf/test.yaml
ck: host: 11.11.11.11 port: 9001 database: db2 username: test2 password: 123ck456 user: test password: 123yy456 host: 10.10.10.10 port: 3306 dbname: db1
2、主程序
package main import ( "database/sql" "fmt" "gopkg.in/yaml.v3" "io/ioutil" "time" ) type Conn struct { Ck struct { Host string `yaml:"host"` Port string `yaml:"port"` Database string `yaml:"database"` Username string `yaml:"username"` Password string `yaml:"password"` } } type Mysql struct { User string `yaml:"user"` Password string `yaml:"password"` Host string `yaml:"host"` Port string `yaml:"port"` DBname string `yaml:"dbname"` } const cfgFile = "conf/test.yaml" func main() { data, err := ioutil.ReadFile(cfgFile) //讀取配置文件的路徑 if err != nil { fmt.Printf("err: %v\n", err) return } var conf Conn if err := yaml.Unmarshal(data, &conf); err != nil { //將yaml文件中的信息反序列化給conf結(jié)構(gòu)體 fmt.Printf("err: %v\n", err) return } yml, _ := yaml.Marshal(conf) //序列化為yaml文件 fmt.Printf("conf: %#v\n", conf) fmt.Printf("%s\n", yml) var confs Mysql if err := yaml.Unmarshal(data, &confs); err != nil { fmt.Printf("err: %v\n", err) return } yaml, _ := yaml.Marshal(confs) fmt.Printf("conf: %#v\n", confs) fmt.Printf("%s\n", yaml) //連接數(shù)據(jù)庫(kù) user := confs.User password := confs.Password host := confs.Host port := confs.Port database := confs.DBname dataSourceName := user + ":" + password + "@tcp(" + host + ":" + port + ")/" + database + "?charset=utf8&parseTime=True" conn, err := sql.Open("mysql", dataSourceName) if err != nil { return } conn.SetConnMaxLifetime(time.Minute * 30) //最大連接超時(shí)時(shí)間,應(yīng)小于數(shù)據(jù)庫(kù)本身的鏈接超時(shí)時(shí)間 conn.SetMaxIdleConns(10) //最大閑置連接數(shù)(并發(fā)時(shí)可以同時(shí)獲取的連接,也是用完后放回池里面的互用的連接, 從而提升性能) conn.SetMaxOpenConns(100) //最大打開(kāi)連接數(shù),0為不限制 //記得結(jié)束后關(guān)閉連接 defer conn.Close() }
3、輸出結(jié)果
conf: main.Conn{Ck:struct { Host string "yaml:\"host\""; Port string "yaml:\"por t\""; Database string "yaml:\"database\""; Username string "yaml:\"username\""; Password string "yaml:\"password\"" }{Host:"11.11.11.11", Port:"9001", Database: "db2", Username:"test2", Password:"123ck456"}} ck: host: 11.11.11.11 port: "9001" database: db2 username: test2 password: 123ck456 conf: main.Mysql{User:"test", Password:"123yy456", Host:"10.10.10.10", Port:"330 6", DBname:"db1"} user: test password: 123yy456 host: 10.10.10.10 port: "3306" dbname: db1
4、補(bǔ)充
4.1 已棄用 'ReadFile'
從 Go 語(yǔ)言 1.16 開(kāi)始,ioutil.ReadAll、ioutil.ReadFile 和 ioutil.ReadDir 被棄用,因?yàn)?io/ioutil 包被棄用。
解決方法如下,使用 io 或 os 包中相同的方法替換,即修改自己按如下參照修改包名即可
ioutil.ReadAll -> io.ReadAll ioutil.ReadFile -> os.ReadFile ioutil.ReadDir -> os.ReadDir // others ioutil.NopCloser -> io.NopCloser ioutil.ReadDir -> os.ReadDir ioutil.TempDir -> os.MkdirTemp ioutil.TempFile -> os.CreateTemp ioutil.WriteFile -> os.WriteFile
4.2 yaml文件里的變量命名規(guī)則
yaml文件里的變量需全用小寫字母。使用大寫字母、中劃線、下劃線等,如 CK: 127.1.1.1 mySQL : xxx Myql : xxx my_sql : xxx 會(huì)在解讀yaml配置文件時(shí)出問(wèn)題,解讀出來(lái)是空值,且不會(huì)報(bào)錯(cuò)
到此這篇關(guān)于Golang解析yaml文件的方法小結(jié)的文章就介紹到這了,更多相關(guān)Go解析yaml內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家
相關(guān)文章
Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn)
defer是Go語(yǔ)言的關(guān)鍵字,一般用于資源的釋放和異常的捕捉,defer語(yǔ)句后將其后面跟隨的語(yǔ)句進(jìn)行延遲處理,就是說(shuō)在函數(shù)執(zhí)行完畢后再執(zhí)行調(diào)用,也就是return的ret指令之前,本文給大家介紹了Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn),需要的朋友可以參考下2023-11-11Go語(yǔ)言實(shí)現(xiàn)釘釘發(fā)送通知
本文通過(guò)代碼給大家介紹了Go語(yǔ)言實(shí)現(xiàn)釘釘發(fā)送通知,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11Golang如何實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法示例
進(jìn)制轉(zhuǎn)換是人們利用符號(hào)來(lái)計(jì)數(shù)的方法,進(jìn)制轉(zhuǎn)換由一組數(shù)碼符號(hào)和兩個(gè)基本因素“基數(shù)”與“位權(quán)”構(gòu)成,這篇文章主要給大家介紹了關(guān)于Golang如何實(shí)現(xiàn)10進(jìn)制轉(zhuǎn)換62進(jìn)制的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí)學(xué)習(xí),下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09Golang使用gin框架實(shí)現(xiàn)一個(gè)完整的聊天室功能
由于我們項(xiàng)目的需要,我就研究了一下關(guān)于websocket的相關(guān)內(nèi)容,去實(shí)現(xiàn)一個(gè)聊天室的功能,經(jīng)過(guò)幾天的探索,現(xiàn)在使用Gin框架實(shí)現(xiàn)了一個(gè)完整的聊天室+消息實(shí)時(shí)通知系統(tǒng),感興趣的小伙伴歡迎閱讀本文2023-08-08GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)
這篇文章主要為大家介紹了GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03