Go语言从入门到规范-6.9、Go处理yml和ini文件

2023-11-10

Go语言从入门到规范-6.9、Go处理yml和ini文件


1. 前言

一般yml和ini都是作为配置文件来使用的,但是实际上它们都是一种新的语言,主要是方便序列化数据便于我们进行互联网数据传输而创建的,虽然它们没有json和xml那么频繁的使用,但是也是有很多使用场景的,之前我们已经对yml做了简单介绍:https://blog.csdn.net/weixin_39510813/article/details/115633101

接下来我们再对ini做学习和总结。

2. ini概念

2.1 概述

INI文件是一种无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统上,许多程序也会采用INI文件做为配置文件之用。Windows操作系统后来以注册表的形式取代掉INI档。INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。有时候,INI文件也会以不同的扩展名,如“.CFG”、“.CONF”、或是“.TXT”代替。

目前还有很多程序和软件使用ini文件进行初始化以及作为一些配置文件来使用。

2.2 格式

节:section

参数:键=值 name=value

注解:注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。

2.3 示例

; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Products

[database]
server=192.0.2.42 ; use IP address in case network name resolution is not working
port=143
file="acme payroll.dat"

比如mysql数据我们就可以借助ini文件对其进行一些配置。

3. Go语言处理ini文件

gopkg.in/ini.v1

使用说明:

https://ini.unknwon.io/docs/intro/getting_started

创建一个my.ini文件:

# possible values : production, development
app_mode = development

[paths]
# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
data = /home/git/grafana

[server]
# Protocol (http or https)
protocol = http

# The http port  to use
http_port = 9999

# Redirect to correct domain if host header does not match domain
# Prevents DNS rebinding attacks
enforce_domain = true

很好,接下来我们需要编写 main.go 文件来操作刚才创建的配置文件。

package main

import (
    "fmt"
    "os"

    "gopkg.in/ini.v1"
)

func main() {
    cfg, err := ini.Load("my.ini")
    if err != nil {
        fmt.Printf("Fail to read file: %v", err)
        os.Exit(1)
    }

    // 典型读取操作,默认分区可以使用空字符串表示
    fmt.Println("App Mode:", cfg.Section("").Key("app_mode").String())
    fmt.Println("Data Path:", cfg.Section("paths").Key("data").String())

    // 我们可以做一些候选值限制的操作
    fmt.Println("Server Protocol:",
        cfg.Section("server").Key("protocol").In("http", []string{"http", "https"}))
    // 如果读取的值不在候选列表内,则会回退使用提供的默认值
    fmt.Println("Email Protocol:",
        cfg.Section("server").Key("protocol").In("smtp", []string{"imap", "smtp"}))

    // 试一试自动类型转换
    fmt.Printf("Port Number: (%[1]T) %[1]d\n", cfg.Section("server").Key("http_port").MustInt(9999))
    fmt.Printf("Enforce Domain: (%[1]T) %[1]v\n", cfg.Section("server").Key("enforce_domain").MustBool(false))
    
    // 差不多了,修改某个值然后进行保存
    cfg.Section("").Key("app_mode").SetValue("production")
    cfg.SaveTo("my.ini.local")
}

结果:

App Mode: development
Data Path: /home/git/grafana
Server Protocol: http
Email Protocol: smtp
Port Number: (int) 9999
Enforce Domain: (bool) true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言从入门到规范-6.9、Go处理yml和ini文件 的相关文章

  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • 使用泛型:类型参数 T 不能与 == 进行比较

    我正在操场上玩 Go Generics 尝试编写一些通用数组函数 https gotipplay golang org p vS7f Vxxy2j https gotipplay golang org p vS7f Vxxy2j packa
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • 如何在 Go 中获取给定月份的第一个星期一?

    我正在尝试获取给定月份的第一个星期一 我能想到的最好方法是循环前 7 天 然后返回 Weekday Monday 有一个更好的方法吗 通过查看时间的 Weekday 您可以计算出第一个星期一 package main import fmt
  • php 中 php.ini 的 log_errors 和 error_log

    我正在尝试通过 php ini 更改 php ini 中的设置 我的问题是 当出现错误时 它不会放入文件 error log txt 中 那么我做错了什么 这是我的代码 Settings for php ini ini set sessio
  • Go的堆接口实现的优先级队列的大小限制

    在Java中 有一个具有大小属性 的PriorityQueue 我在这里也期待同样的事情 如果我没记错的话 用例 一一读取数百万数据并将其发送到优先级队列 我只想要前 5 个计算元素 因此我只想要大小为 5 的堆 优先级队列 我正在尝试使用
  • 如何在Google AppEngine上设置环境变量?

    我正在尝试在谷歌应用程序引擎上设置和使用环境变量 我的 app yaml 文件如下所示 但是 当我使用 os Getenv mytoken 时 我得到一个空字符串 而不是我设置的实际值 是GAE的bug吗 api version go1 h
  • Golang http 写入响应,无需等待完成

    我正在构建一个应用程序 该应用程序构建 pdf 文件并在收到请求时将其返回给客户端 由于其中一些 pdf 文件可能需要一些时间才能生成 我想在客户端运行时定期将某种状态更新发送回客户端 当完成 pdf 文件的构建后 它也应该返回给客户 类似
  • Go 中的数据竞争:为什么会在 10-11 毫秒以下发生?

    这是我运行的代码 package main import fmt time const delay 9 time Millisecond func main n 0 go func time Sleep delay n fmt Printl
  • 是否可以将 Go 代码作为脚本运行?

    随着Go正在成为 系统 的语言 我想知道是否可以将 Go 代码作为脚本运行而不编译它 有可能这样做吗 动机 因为有关于动机的问题 取自如何使用 Scala 作为脚本语言 http alvinalexander com scala how t
  • go build 不断抱怨:go.mod 有 post-v0 模块路径

    Go 1 11 发布后 我一直在尝试将我的存储库移动到 Go 模块 方法是添加go mod文件在其根目录下 我的根库之一my host root其版本为17 0 1 所以我在其中写道go mod file module my host ro
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • GO中的优先级队列

    谁能向我解释一下 我想在GO中实现一个优先级队列 接口实现来自link https golang org pkg container heap example priorityQueue 但优先级最低 我的代码 pq make Priori
  • 模块路径格式错误...第一个路径元素中缺少点

    我有一个包含 2 个不同可执行文件的项目 每个可执行文件都有自己的依赖项以及对根的共享依赖项 如下所示 Root gt server gt main go gt someOtherFiles go gt go mod gt go sum g

随机推荐

  • MongoDB安装部署

    一 mongodb安装部署 关闭防火墙和selinux root mongodb iptables F root mongodb setenforce 0 root mongodb systemctl stop firewalld 2 指定
  • hdu 3879 最大密集子图(点和边均带权)(模板)

    最大权闭合图 可以用最大密集子图来解速度更快复杂度低 题解 胡伯涛 最小割模型在信息学竞赛中的应用 点和边均带权的最大密集子图 s i 权为U 点权绝对值和 边的所有权值 i t 权为U 点的值 点的度 u v 权值为w 意思是选了v后可以
  • Mybatis-plus使用手册

    Mybatis plus 1 定义 MyBatis Plus 是一个 Mybatis 增强版工具 在 MyBatis 上扩充了其他功能没有改变其基本功能 为了简化开发提交效率而存在 2 使用 SpringBoot 集成 MyBatis Pl
  • 相关性分析

    这里的相关性分析主要是线性相关性分析 当然其他的形状的相关性分析可以通过变换转换为线性相关性分析 但是 线性相关性分析始终是相关性分析的基础 线性相关分析的构建主要分为以下几种 直接绘制散点图 通过把点标出来主观上看是否是线性相关 绘制散点
  • 《动手学深度学习》第二十三天---稠密连接网络(DenseNet)

    一 DenseNet DenseNet作为另一种拥有较深层数的卷积神经网络 具有如下优点 1 相比ResNet拥有更少的参数数量 2 旁路加强了特征 feature 的重用 3 网络更易于训练 并具有一定的正则效果 4 缓解了gradien
  • Android Studio按钮背景色

    Android Studio按钮背景色改变 修改style xml theme xml 在Android Studio里写前端界面 修改Button的背景样式一直是系统默认的主题色就像这样 不管怎么改颜色都会是系统的默认主题色 这里我们需要
  • LC并联谐振电路的原理

    LC并联谐振电路的原理 2011 11 26 04 54 353744594 来自 手机知道 分类 电脑 网络 浏览6573次 LC并联谐振电路的原理 我怎么不能理解这个原理 能不能用生活中的例子来说明 谢谢 提问者采纳 2011 11 2
  • Springboot使用maven打包指定mainClass

    http jvm123 com 2019 12 springboot repackage html
  • 六、Linux系统编程:读写锁

    5 读写锁 读写锁 ReentrantReadWriteLock 就是读线程和读线程之间不互斥 读读不互斥 读写互斥 写写互斥 一个资源可以被多个读线程访问 也可以被一个写线程访问 但不能同时存在读写线程 读写互斥 读读共享 5 1 锁操作
  • Meetup预告

    2月份 我们匠心打磨的区块链跨链协作平台WeCross正式开源 技术白皮书同期发布 很多小伙伴认真品读研究之后 给我们提供了非常多及时和有益的反馈 我们深表感谢 关于WeCross的设计哲学 我们思考了四个方向 Synergetic 跨链业
  • Ceph入门到精通-存储集群ceph df 用量统计算法说明

    3 2 5 Ceph 如何计算数据使用量 used 值反映了使用的实际原始存储量 xxx GB xxx GB 代表可用的存储 其中较小的数字 和总存储容量 总容量反映了在复制 克隆或快照前存储数据的大小 因此 实际存储的数据量通常会超过名义
  • Android基础学习(十七)—— Retrofit

    Retrofit本身并没有提供网络访问的能力 但是它底层封装了OkHttp 也是由Square公司贡献的一个处理网络请求的开源项目 A type safe HTTP client for Android and Java https git
  • parent.layer.closeAll();关闭弹出层

    可参考文档 https wenku baidu com view e05a3fe15bf5f61fb7360b4c2e3f5727a5e92486 html 关闭所有页面 parent layer closeAll 先得到当前ifame层的
  • 数据库的备份与恢复

    目录 1 数据库的备份与恢复是什么 2 数据库的备份与恢复的三种常见方法 2 1 使用第三方工具 我用的是navicat 导入 导出 2 2 使用mysqldump命令备份和恢复 导入 导出 2 3 LOAD DATA INFILE 导入
  • ArcGIS制作全球地图并生成纬度统计分布线

    转载 ArcGIS制作全球地图并生成纬度统计分布线https mp weixin qq com s LTA9I2lZ1nwA1xdHlD9vjg
  • MYSQL数据导入导出&视图&索引&执行计划

    目录 一 数据导入 导出 二 视图运用 三 索引 四 执行计划 一 数据导入 导出 创建log数据表 CREATE TABLE t log id varchar 32 NOT NULL COMMENT 唯一标识 ip varchar 15
  • C++STL库之sort函数

    sort函数 sort函数介绍 背景 功能 语法 便捷函数 sort函数应用 普通排序 结构体排序 sort函数介绍 背景 sort函数用于C 中 对给定区间所有元素进行排序 默认为升序 也可进行降序排序 sort函数进行排序的时间复杂度为
  • 【Meta-AI】Sam-分割一切 测试

    什么是 SAM 近日 Meta AI在官网发布了基础模型 Segment Anything Model SAM 并开源 其本质是用GPT的方式 基于Transform 模型架构 让计算机具备理解了图像里面的一个个 对象 的通用能力 SAM模
  • 【数学建模笔记 13】数学建模的差分方程模型

    13 差分方程模型 定义 设函数 x k x k x k x k
  • Go语言从入门到规范-6.9、Go处理yml和ini文件

    Go语言从入门到规范 6 9 Go处理yml和ini文件 文章目录 Go语言从入门到规范 6 9 Go处理yml和ini文件 1 前言 2 ini概念 2 1 概述 2 2 格式 2 3 示例 3 Go语言处理ini文件 1 前言 一般ym