Golang解析yaml文件的方法小结
作者:心恩惠动
Go 语言没有内置解析 yaml 文件的功能,实现 yaml 的解析可以使用第三方库,下面我们就来看看如何使用opkg.in/yaml.v2 和 gopkg.in/yaml.v3实现解析yaml吧
yaml 文件是目前最常用的配置文件,使用go语言编写代码和工具时,也会用到yaml文件,将服务配置及中间件等信息定义到yaml文件中,后续可根据实际场景来选用。
//先下载外部包 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结构体 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) //连接数据库 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) //最大连接超时时间,应小于数据库本身的链接超时时间 conn.SetMaxIdleConns(10) //最大闲置连接数(并发时可以同时获取的连接,也是用完后放回池里面的互用的连接, 从而提升性能) conn.SetMaxOpenConns(100) //最大打开连接数,0为不限制 //记得结束后关闭连接 defer conn.Close() }
3、输出结果
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、补充
4.1 已弃用 'ReadFile'
从 Go 语言 1.16 开始,ioutil.ReadAll、ioutil.ReadFile 和 ioutil.ReadDir 被弃用,因为 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文件里的变量命名规则
yaml文件里的变量需全用小写字母。使用大写字母、中划线、下划线等,如 CK: 127.1.1.1 mySQL : xxx Myql : xxx my_sql : xxx 会在解读yaml配置文件时出问题,解读出来是空值,且不会报错
到此这篇关于Golang解析yaml文件的方法小结的文章就介绍到这了,更多相关Go解析yaml内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家