Golang使用ini库读取配置详情

目录
  • go-ini的分区
  • go-ini的安装
  • ini文件的格式
  • 读取ini文件的配置项
    • 直接加在ini文件,通过方法读取
    • 定义结构体来存放配置项,将配置项映射到结构体中
  • 父子分区
  • 两份关键代码

go-ini的分区

go-ini的多个配置项通过分区(section)来划分。有默认(空)分区和命名的分区,没有给分区命名就是默认分区,默认分区必须写在任何一个命名分区的上边。每个配置项通过换行来区分。

go-ini的安装

go-ini/ini是GitHub上的一个代码库,和其他golang库一样,通过golang命令行下载即可,如果下载速度慢可尝试切换代理:go env -w GOPROXY=https://goproxy.cn

下载命令:

go get github.com/go-ini/ini

ini文件的格式

ini文件以分区来划分多块配置,

默认分区必须写在任何一个命名分区的上边,多个配置项用换行符号分割。

读取ini文件的配置项

直接加在ini文件,通过方法读取

  • 使用ini.load(ini文件路径)即可。返回一个配置文件结构体指针和错误信息
cfgs, err := ini.Load("./conf/go-conf.ini")
if err != nil {
    fmt.Println(err)
}
// cfgs是配置文件的结构体指针

读取命名分区数据:

sp := cfgs.Section()选择一个分区,返回分区的结构体指针

Key()是分区结构体的一个方法,读取分区的配置项,返回一个键的结构体指针

val := cfgs.Section("kafka").Key("address").Value()
fmt.Print(val)
​
// 打印 : 127.0.0.1:9092
  • 读取默认分区数据

    默认分区只需要键分区明为空即可:val := cfgs.Section().key().Value()

val := cfgs.Section("").Key("a").Value()
fmt.Print(val)
// 打印:  122
  • 关于读取到的键结构体指针。可以键值转为多种类型,包括单不限于go的基本数据类型,有两个返回值

    Value()则直接不做换回直接返回,只有一个返回值

// 直接返回值
val := cfgs.Section("").Key("a").Value()
fmt.Print(val)
// 打印:  122
// 返回一个int类型的key值
val,err := cfgs.Section("").Key("a").Int()
if err != nil {
        fmt.Print(err)
}
fmt.Print(val)
// 打印:  122

定义结构体来存放配置项,将配置项映射到结构体中

定义与ini配置项匹配的结构体,通过ini.MapTo()将配置映射到结构体中。

结构体中成员属性必须加上tagini库通过tap映射对应的配置项,

type KafkaConfig struct {
    // ini用于给ini库做标识
    Address string `ini:"address"`
}
type TailConfig struct {
    Path     string `ini:"path"`
    Filename string `ini:"fileName"`
    // 如果是结构体,则指明分区名。其他指明配置项即可
    Children `ini:"tailfile.children"`
}
type Children struct {
    Name string `ini:"name"`
}
type Config struct {
    KafkaConfig `ini:"kafka"`
    TailConfig  `ini:"tailfile"`
}
​
func main() {
    // 先实例化结构体,将指针传入MapTo方法中
    var cfg = new(Config)
    err := ini.MapTo(cfg, "./conf/go-conf.ini")
    if err != nil {
        fmt.Print(err)
    }
// 取最深的配置项
fmt.Println(cfg.TailConfig.Children.Name)
}    
// 运行结果: pp_mode

父子分区

go-ini有父子分区,但是层级不是很分明。不管是在结构体中还是直接文件操作,操作起来和平级一样的。

您可以在分区名称中使用 . 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。

就如上个例子中,映射cfg.TailConfig.Children, tag上标明的是tailfile.children,这和平级完全是一样的,层级还是通过结构体体现出来的

两份关键代码

  • main.go
package main
​
import (
    "fmt"
​
    "github.com/go-ini/ini"
)
​
type KafkaConfig struct {
    Address string `ini:"address"`
}
type TailConfig struct {
    Path     string `ini:"path"`
    Filename string `ini:"fileName"`
    // 如果是结构体,则指明分区名
    Children `ini:"tailfile.children"`
}
type Config struct {
    KafkaConfig `ini:"kafka"`
    TailConfig  `ini:"tailfile"`
}
type Children struct {
    Name string `ini:"name"`
}
​
func main() {
​
    // var cfg = new(Config)
    // err := ini.MapTo(cfg, "./conf/go-conf.ini")
    // if err != nil {
    //  fmt.Print(err)
    // }
    // fmt.Println(cfg.TailConfig.Children.Name)
​
    cfgs, err := ini.Load("./conf/go-conf.ini")
    if err != nil {
        fmt.Println(err)
    }
    // val,_ := cfgs.Section("").Key("a").Int()
​
    fmt.Print(val)
​
​
}
​
  • go-conf.ini
a=122
​
[kafka]
address = 127.0.0.1:9092
​
[tailfile]
path     = f:/runtime/tmp
fileName = 4.log
​
[tailfile.children]
name = pp_mode
​
​

到此这篇关于Golang使用ini库读取配置详情的文章就介绍到这了,更多相关Golang 使用ini库读取配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈golang package中init方法的多处定义及运行顺序问题

    在不了解这个问题之前,在网上搜索一下竟然搜出了两个完全相反的结果,所以打算自己测试下这个问题. 首先给出结论: 在同一个package中,可以多个文件中定义init方法 在同一个go文件中,可以重复定义init方法 在同一个package中,不同文件中的init方法的执行按照文件名先后执行各个文件中的init方法 在同一个文件中的多个init方法,按照在代码中编写的顺序依次执行不同的init方法 下面看下测试的代码: 在当前目录下新建main.go及testinit目录,在testinit目录下

  • Golang使用ini库读取配置详情

    目录 go-ini的分区 go-ini的安装 ini文件的格式 读取ini文件的配置项 直接加在ini文件,通过方法读取 定义结构体来存放配置项,将配置项映射到结构体中 父子分区 两份关键代码 go-ini的分区 go-ini的多个配置项通过分区(section)来划分.有默认(空)分区和命名的分区,没有给分区命名就是默认分区,默认分区必须写在任何一个命名分区的上边.每个配置项通过换行来区分. go-ini的安装 go-ini/ini是GitHub上的一个代码库,和其他golang库一样,通过g

  • PostgreSql从库重新配置的详情

    目录 1 复制从库之前配置的参数文件 2.停下现有的从库 3.开启主库的备份状态 4.把主数据库目录拷贝到备库目录就可以了: 5.还原之前复制的recovery.conf文件 6.停下主库备份 7.启动备库 postgresql数据库采用主从配置 在主库正常从库挂掉的情况下 重新对从库配置

  • Python使用configparser库读取配置文件

    这篇文章主要介绍了Python使用configparser库读取配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景: 在写接口自动化框架,配置数据库连接时,测试环境和UAT环境的连接信息不一致,这时可以将连接信息写到conf或者cfg配置文件中 python环境请自行准备. python代码直接封装成类,方便其他模块的引入. from configparser import ConfigParser class DoConfig: d

  • Flask 使用类组织配置详情

    在实际的项目中,我们一般都会建立三个环境:开发.测试和生产环境,这三种环境会使用不同的配置组合,为了能方便地切换配置,我们可以为不同的环境创建不同的配置文件,但是最方便的做法是在单个配置文件中使用 Python 类来组织多个不同类别的配置. 例如下面是一个应用的配置文件 settings.py,它包含一个基本配置类 BaseConfig, 还有其他特定的配置类: 开发配置类 DevelopConfig 测试配置类 TestCofig 生产配置类 ProductConfig 这些特定配置类都继承自

  • golang图片处理库image基本操作

    目录 基本操作 读取 新建 保存 图片修改 转换 裁剪 缩放 基本操作 图片的基本读取与保存. 读取 图片读取和文件读取类似,需要先获取流: 注册图片的解码器(如:jpg则import _ "image/jpeg", png则import _ "image/png") 通过os.open打开文件获取流: 通过image.Decode解码流,获取图片: import _ "image/jpeg" func readPic() image.Image

  • GoLang之标准库encoding/json包

    目录 1.JSON介绍 2.JSON序列化.反序列化介绍 3.encoding/json包介绍 4.Marshal函数 5.Umarshal函数 6.结构体标签Tag 注:本文以Windos系统上Go SDK v1.8进行讲解 1.JSON介绍 在进行前后分离式开发时,json显得格外的重要,因为他是链接前后台重要的枢纽json是储存和交换文本信息的语法,他类似于xml,但是他比xml更加的便捷,快速,易于解析.主要使用场景就是作为前后台数据交互的枢纽,以下是一个简单json的格式:JSON:

  • Golang 经典校验库 validator 用法解析

    目录 开篇 validator 使用方法 内置校验器 1. Fields 2. Network 3. Strings 4. Formats 5. Comparisons 6. Other 7. 别名 错误处理 小结 开篇 今天继续我们的 Golang 经典开源库学习之旅,这篇文章的主角是 validator,Golang 中经典的校验库,它可以让开发者可以很便捷地通过 tag 来控制对结构体字段的校验,使用面非常广泛. 本来打算一节收尾,越写越发现 validator 整体复杂度还是很高的,而且

  • golang使用excelize库操作excel文件的方法详解

    目录 1. 准备工作 2. 使用excelize读取excel文件 3. 使用excelize将数据写入excel文件 4. 参考资料: 总结 ​ 今天我们讲一下使用excelize操作excel,首先熟悉一下excel的文件构成,excel分为以下结构: ​ 1. excel文件,2. sheet页, 3. 行row, 4. 列col, 5. 项cell ​ 对应结构如下图: 1. 准备工作 我们读取的文件格式如上图所示, 我们先定义一个StockInfo结构来存储相应字段 type Stoc

  • MySql 5.7.20安装及data和my.ini文件的配置

    1.首先上MySql的官网下载 https://dev.mysql.com/downloads/mysql/ http://www.jb51.net/softs/451120.html 以我所选版本为例(免安装版),选择MYSQL Community Server 然后在右边选择你所对应的版本 我的是64位 下载相应的zip版本 下载完解压到你想要存放的位置 我的是解压到D:\mysql-5.7.20-winx64 解压完成后是没有data文件和my.ini配置文件 这些都是要自己补充(下文有补

  • ASP.NET Core配置教程之读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中.到了.NET Core的时候,很多我们习以为常的东西都发生了改变,其中也包括定义配置的方式.总的来说,新的配置系统显得更加轻量级,并且具有更好的扩展性,其最大的特点就是支持多样化的数据源.我们可以采用内存的变量作为配置的数据源,也可以直接配置定义在持久化的文件甚至数据库中. 由

随机推荐