Golang解析yaml文件的方法小结

 更新时间:2024年11月01日 09:19:11   作者:心恩惠动  
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家

相关文章

  • 使用Golang的Context管理上下文的方法

    使用Golang的Context管理上下文的方法

    这篇文章主要介绍了使用Golang的Context管理上下文的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 简单高效!Go语言封装二级认证功能实现

    简单高效!Go语言封装二级认证功能实现

    本文将介绍如何使用Go语言封装二级认证功能,实现简单高效的用户认证流程,二级认证是一种安全措施,要求用户在登录后进行额外的身份验证,以提高账户安全性,
    2023-10-10
  • GO语言判断一个网段是否属于另一个网段的子网

    GO语言判断一个网段是否属于另一个网段的子网

    这篇文章主要介绍了GO语言判断一个网段是否属于另一个网段的子网的相关资料,内容介绍详细,具有一定的参考价值,需要的朋友可任意参考一下
    2022-03-03
  • golang连接mysql数据库操作使用示例

    golang连接mysql数据库操作使用示例

    这篇文章主要为大家介绍了golang连接mysql数据库操作使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 浅谈golang通道类型

    浅谈golang通道类型

    本文主要介绍了浅谈golang通道类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go实现set类型的示例代码

    Go实现set类型的示例代码

    本文主要介绍了Go实现set类型的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 使用 go 实现多线程下载器的方法

    使用 go 实现多线程下载器的方法

    本篇文章带领大家学习使用go实现一个简单的多线程下载器,给她家详细介绍了多线程下载原理及实例代码,感兴趣的朋友跟随小编一起看看吧
    2021-10-10
  • golang利用pprof与go-torch如何做性能分析

    golang利用pprof与go-torch如何做性能分析

    这篇文章主要给大家介绍了关于golang利用pprof与go-torch如何做性能分析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Gin的中间件执行流程与用法详解

    Gin的中间件执行流程与用法详解

    我们在使用Gin框架进行Web开发的时候,基本上都会遇到登录拦截的场景,在Gin当中, 中间件和业务处理函数都是一样的类型,都是一种函数,本文给大家介绍了Gin的中间件执行流程与用法,需要的朋友可以参考下
    2024-04-04
  • go语言if/else语句简单用法示例

    go语言if/else语句简单用法示例

    这篇文章主要介绍了go语言if/else语句用法,结合实例形式分析了go语言if else语句的判定与流程控制技巧,需要的朋友可以参考下
    2016-05-05

最新评论