当前位置: 代码网 > it编程>前端脚本>Golang > Golang解析yaml文件的方法小结

Golang解析yaml文件的方法小结

2024年11月26日 Golang 我要评论
yaml 文件是目前最常用的配置文件,使用go语言编写代码和工具时,也会用到yaml文件,将服务配置及中间件等信息定义到yaml文件中,后续可根据实际场景来选用。//先下载外部包go get -u g

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com