go读取yaml,json,ini等配置文件
实际项目中,要读取一些json等配置文件。今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的。
一. go读取json配置文件
JSON 应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成。
- 1.创建 conf.json:
{"enabled": true,"path": "/usr/local"
}
- 2.新建config_json.go:
package mainimport ("encoding/json""fmt""os"
)type configuration struct {Enabled boolPath string
}func main() {// 打开文件file, _ := os.Open("conf.json")// 关闭文件defer file.Close()//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。decoder := json.NewDecoder(file)conf := configuration{}//Decode从输入流读取下一个json编码值并保存在v指向的值里err := decoder.Decode(&conf)if err != nil {fmt.Println("Error:", err)}fmt.Println("path:" + conf.Path)
}
启动运行后,输出如下:
D:\Go_Path\go\src\configmgr>go run config_json.go
path:/usr/local
1.2 复杂json解析
假设test.json内容如下,如何解析?
{"pids":{"default":{"pid":"1844_71935560","desc":"app1"},"shehui":{"pid":"1844_101751664","desc":"app2"}}, "top_words":["邓紫棋", "沈腾","关晓彤","鹿晗"]
}
通过json转struct工具转换:
Golang: Convert JSON to Struct
JSON-to-Go: Convert JSON to Go instantly
转化后的struct
type configuration struct {Pids struct {Default struct {Pid string `json:"pid"`Desc string `json:"desc"`} `json:"default"`Shehui struct {Pid string `json:"pid"`Desc string `json:"desc"`} `json:"shehui"`} `json:"pids"`TopWords []string `json:"top_words"`
}
demo实现:
package mainimport ("encoding/json""fmt""os"
)type configuration struct {Pids struct {Default struct {Pid string `json:"pid"`Desc string `json:"desc"`} `json:"default"`Shehui struct {Pid string `json:"pid"`Desc string `json:"desc"`} `json:"shehui"`} `json:"pids"`TopWords []string `json:"top_words"`
}func parseJsonConfig(filepath string) (conf configuration) {// 打开文件file, _ := os.Open(filepath)// 关闭文件defer file.Close()conf = configuration{}//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。//Decode从输入流读取下一个json编码值并保存在v指向的值里err := json.NewDecoder(file).Decode(&conf)if err != nil {fmt.Println("Error:", err)}return
}func main() {pdd := parseJsonConfig("D:\\LearnGo\\FirstGo\\10-文件操作\\test3.json")fmt.Println(pdd)fmt.Println(pdd.Pids.Shehui.Pid)}
再继续来个案例:
假设json文件内容如下,想读取top_words中name的值,要怎么解析获取?
{"pids":{"default":{"pid":"1844_71935560","desc":"app1"},"shehui":{"pid":"1844_101751664","desc":"app2"}},"top_words":[{"name": "cc","age": 18},{"name": "test","age": 20}]
}
demo实现
package mainimport ("encoding/json""fmt""os"
)type configuration1 struct {Pids struct {Default struct {Desc string `json:"desc"`Pid string `json:"pid"`} `json:"default"`Shehui struct {Desc string `json:"desc"`Pid string `json:"pid"`} `json:"shehui"`} `json:"pids"`TopWords []struct {Age int64 `json:"age"`Name string `json:"name"`} `json:"top_words"`
}func parseJsonConfig1(filepath string) (conf configuration1) {// 打开文件file, _ := os.Open(filepath)// 关闭文件defer file.Close()conf = configuration1{}//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。//Decode从输入流读取下一个json编码值并保存在v指向的值里err := json.NewDecoder(file).Decode(&conf)if err != nil {fmt.Println("Error:", err)}return
}func main() {pdd := parseJsonConfig1("D:\\LearnGo\\FirstGo\\10-文件操作\\test4.json")fmt.Println(pdd)//遍历string切片获取name的值for _, i := range pdd.TopWords { name := i.Namefmt.Println(name)}}
运行结果:
{{{app1 1844_71935560} {app2 1844_101751664}} [{18 cc} {20 test}]}
cc
test
最后一个工作用到的案例:读取json文件中的规则,做正则匹配,这里没有进行匹配操作,后续用到加上
{"reverse_shell_rule":[{"id":"R10000","regex":"socat\\s+TCP4:\\w+\\.\\w+\\.\\w+\\.\\w+:(\\w+)\\s+.*"},{"id":"R10001","regex":"exec\\s+\\d+\\<\\>\/\\w+\/.*"}]
}
// 读取JSON文件 将内容转为结构对象 然后更改数据package mainimport ("encoding/json""fmt""io/ioutil"
)type ReverseJson struct {ReverseShellRule []struct {ID string `json:"id"`Regex string `json:"regex"`} `json:"reverse_shell_rule"`
}func main() {var data ReverseJson// 读取JSON文件内容 返回字节切片bytes, _ := ioutil.ReadFile("D:\\LearnGo\\FirstGo\\10-文件操作\\test.json")// 打印时需要转为字符串fmt.Println(string(bytes))// 将字节切片映射到指定结构上json.Unmarshal(bytes, &data)//fmt.Println("*** unmarshal result: ***")// 打印对象结构for _, reg := range data.ReverseShellRule {rule := reg.Regexfmt.Println(rule)}}
二、 go读取.ini配置文件
INI文件格式是某些平台或软件上的配置文件的非正式标准,由节(section)和键(key)构成,比较常用于微软Windows操作系统中。这种配置文件的文件扩展名为INI。
- 1.创建 conf.ini:
[Section]
enabled = true
path = /usr/local # another comment
- 2.下载第三方库:go get gopkg.in/gcfg.v1
- 3.新建 config_ini.go:
package mainimport ("fmt"gcfg "gopkg.in/gcfg.v1"
)func main() {config := struct {Section struct {Enabled boolPath string}}{}err := gcfg.ReadFileInto(&config, "conf.ini")if err != nil {fmt.Println("Failed to parse config file: %s", err)}fmt.Println(config.Section.Enabled)fmt.Println(config.Section.Path)
}
启动运行后,输出如下:
D:\Go_Path\go\src\configmgr>go run config_ini.go
true
/usr/local
三、go读取yaml配置文件
yaml 可能比较陌生一点,但是最近却越来越流行,尤其在SpringBoot中的application.yml或者application.yaml中使用非常广泛。也就是一种标记语言。层次结构也特别简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成。
golang的标准库中暂时没有给我们提供操作yaml的标准库,但是github上有很多优秀的第三方库开源给我们使用。
-
- 创建 conf.yaml:
enabled: true
path: /usr/local
- 2.下载第三方库:go get gopkg.in/yaml.v2
- 3.创建 config_yaml.go:
package mainimport ("fmt""io/ioutil""log""gopkg.in/yaml.v2"
)type conf struct {Enabled bool `yaml:"enabled"` //yaml:yaml格式 enabled:属性的为enabledPath string `yaml:"path"`
}func (c *conf) getConf() *conf {yamlFile, err := ioutil.ReadFile("conf.yaml")if err != nil {log.Printf("yamlFile.Get err #%v ", err)}err = yaml.Unmarshal(yamlFile, c)if err != nil {log.Fatalf("Unmarshal: %v", err)}return c
}func main() {var c confc.getConf()fmt.Println("path:" + c.Path)
}
启动运行后,输出如下:
D:\Go_Path\go\src\configmgr>go run config_yaml.go
path:/usr/local
最后 以上,就把golang 读取配置文件的方法,都介绍完了。大家可以拿着代码运行起来看看。
参考资料:
Go 语言解析 JSON 文件 - 知乎 Go 语言解析 JSON 文件(推荐)
如何读取yaml,json,ini等配置文件【Golang 入门系列九】-腾讯云开发者社区-腾讯云
相关文章:
go读取yaml,json,ini等配置文件
实际项目中,要读取一些json等配置文件。今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的。 一. go读取json配置文件 JSON 应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰 ,易于阅读和编写࿰…...
一、安装GoLang环境和开发工具
一、安装GoLang环境 GoLang中国镜像站 下载后对应的环境包以后,一路下一步就好了,安装路径的话,尽量就安装到默认的文件目录下。 二、配置Go的环境变量 右击此电脑–>属性–>高级系统设置–>环境变量,打开环境变量设置…...
条款40:对并发使用std::atomic,对特种内存使用valatile
可怜的volatile。被误解到如此地步。它甚至不应该出现在本章中,因为它与并发程序设计毫无关系。但是在其他程序设计语言中(Java和C#),它还是会对并发程序设计有些用处。甚至在C++中,一些编译器也已经把volatile投入到染缸,使得它的语义显得可以用于并发软件中(但是仅可用…...
Navicat使用HTTP通道服务器进行连接mysql数据库(超简单三分钟完成),centos安装nginx和php,docker安装nginx+php合并版
序言 因为数据库服务器在外网是不能直接连接访问的,但是可以访问网站,网站后台就能访问数据库,所以在此之前,访问数据库的数据是一件非常麻烦的事情,在平时和运维的交流中发现,他们会使用ssh通道进行连接访…...
图:有向无环图(DAG)
1.有向无环图的定义 有向无环图:若一个有向图中不存在环,则称为有向无环图。 简称DAG图(Directed Acyclic Graph) 顶点中不可能出现重复的操作数。 2.有向无环图的应用 1.描述算数表达式 用有向无环图描述算术表达式。 解题步骤: 把各个操作数不重…...
Python入门教程 - 基本语法 (一)
目录 一、注释 二、Python的六种数据类型 三、字符串、数字 控制台输出练习 四、变量及基本运算 五、type()语句查看数据的类型 六、字符串的3种不同定义方式 七、数据类型之间的转换 八、标识符命名规则规范 九、算数运算符 十、赋值运算符 十一、字符串扩展 11.1…...
使用PAM保障开发运营安全
硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞。以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施,构成巨大的数据被盗风险。 什么是PAM 特权访问管理 (PAM) 是指一组 IT 安全管理原则,可…...
《Go 语言第一课》课程学习笔记(十二)
函数 Go 函数与函数声明 在 Go 语言中,函数是唯一一种基于特定输入,实现特定任务并可返回任务执行结果的代码块(Go 语言中的方法本质上也是函数)。在 Go 中,我们定义一个函数的最常用方式就是使用函数声明。 第一部…...
【深入浅出C#】章节10: 最佳实践和性能优化:编码规范和代码风格
编码规范和代码风格之所以重要,是因为它们直接影响到软件开发的质量、可维护性、可读性和协作效率。编码规范和代码风格是编程中的关键要素,它们有助于编写高质量、可维护和易读的代码,提高团队协作效率,减少错误,降低…...
LNMP架构:搭建Discuz论坛
文章目录 1. 编译安装Nginx1.1 前置准备1.2 编译安装1.3 添加nginx系统服务 2.编译安装MySql2.1 前置准备2.2 编译安装2.3 修改mysql 配置文件2.4 设置路径环境变量2.5 初始化数据库2.6 添加musql系统服务2.7 修改MySql登录密码 3. 编译安装PHP3.1 前置准备3.2 编译安装3.3 复制…...
详解Numpy(基于jupyter notebook)
详解Numpy(基于jupyter notebook) 1.创建数组2.数据类型3.数组切片和索引4.Numpy的广播与数组操作5.数组合并与通用函数6.其他通用函数 1.创建数组 #引入numpy包,以后np就代表numpy import numpy as npanp.arange(10,30,2)#10为起点…...
nvm集合node版本,解决新版本jeecgboot3.5.3前端启动失败问题
jeecgboot前端3.5.3页面如下 使用之前的pnpm启动会报错,pnpm是node进行安装的,查询后发现,vue3版本的页面至少需要node16版本,我之前的版本只有15.5,适用于vue2 那么我将先前的node15.5版本删除,然后安装…...
Windows命令行初步:更改配色、提示符以及编码方式
文章目录 启动和退出窗口标题和提示符命令行颜色更改编码 启动和退出 按下winR,调出运行窗口,输入cmd就可以进入命令行了。在Win10以前的系统种,如果在命令行中再输入一个cmd,就会再打开一个命令行。但最近的Win11版本中…...
uniapp onLoad生命周期 uni.$on接受参数无法改变data数据解决办法
问题阐述: a: uni.$emit(name,data)uni.navigateTo({url:b})b:onload(){ uni.$on(name,(res)>{ this.nameres console.log(this.name) })}用以上写法来跨页面传参会发现在b页面,虽然能够接受到参数但是赋值到data时候没生效,虽然控制台能…...
Android Camera开发入门(4):USB/UVC Camera的使用
Android Camera开发入门(4):USB/UVC Camera的使用 本文基于开源项目https://github.com/saki4510t/UVCCamera之上进行二次封装和使用 在前几篇文章中,我们介绍了Camera到CameraX的基础功能应用,同时附上了相关代码,需要的源码的大佬们可以滑到最底部获取。 本篇我们一起…...
Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题
文章目录 介绍jsoup使用1.解析url,获取前端代码2.解决京东安全界面跳转3.获取每一组的数据4.获取商品数据的具体信息4.最终代码 介绍 网络爬虫,就是在浏览器上,代替人类爬取数据,Java网络爬虫就是通过Java编写爬虫代码࿰…...
外观模式:简化复杂子系统的访问与使用
文章目录 1. 简介2. 外观模式的基本结构3. 外观模式的实现步骤4. 外观模式的应用与实例4.1 图形界面库的外观模式应用4.2 文件压缩与解压缩的外观模式应用4.3 订单处理系统的外观模式应用 5. 外观模式的优缺点5.1 优点5.2 缺点 6. 总结 1. 简介 外观模式是一种结构型设计模式&…...
代码随想录day38|509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯
509. 斐波那契数 class Solution:def fib(self, n: int) -> int:#dp含义,递推公式,dp初始化,遍历顺序,打印dpif n 0:return 0dp [0] * (n1)dp[0]0dp[1]1for i in range(2,n1):dp[i] dp[i-1] dp[i-2]return dp[n] 70. 爬楼梯…...
UE5 C++ UGameInstance 功能、作用及应用
# UE5 C UGameInstance 功能及作用 网上有很多文章介绍,例如在游戏中只有一个实例,换关卡不会丢失等。暂时省略。 # UE5 C UGameInstance 应用 ## 应用一,UE5 C UGameInstance 里监听player创建事件 UWebSocketGameInstance.h里的定义 …...
NodeJs-http模块
目录 一、概念二、请求报文的组成三、响应报文的组成四、创建http服务4.1 操作步骤4.2 注意事项 五、获取 HTTP 请求报文5.1 获取请求报文5.2 提取路径和查询字符串 六、设置 HTTP 响应报文七、MIME设置资源类型 一、概念 HTTP(hypertext transport protocol&#…...
编程小白的第一课:用快马AI零代码基础创建个人技能展示网站
作为一个刚接触编程的新手,我最近尝试用InsCode(快马)平台做了一个个人技能展示网站。整个过程比我预想的简单很多,特别适合零基础的同学上手。下面分享我的具体实现过程和心得: 项目规划与结构设计 刚开始完全不懂代码结构,但平台…...
ANR-WatchDog源码深度剖析:从线程监控到错误抛出的完整实现
ANR-WatchDog源码深度剖析:从线程监控到错误抛出的完整实现 【免费下载链接】ANR-WatchDog A simple watchdog that detects Android ANR (Application Not Responding) error and throws a meaningful exception 项目地址: https://gitcode.com/gh_mirrors/an/AN…...
告别GDAL依赖!用Rasterio和TensorFlow 2.6搞定BigEarthNet-MM数据集划分与TFRecord转换
告别GDAL依赖!用Rasterio和TensorFlow 2.6搞定BigEarthNet-MM数据集划分与TFRecord转换 在遥感图像处理领域,BigEarthNet-MM数据集因其多模态特性(Sentinel-1 SAR和Sentinel-2 MSI数据)成为研究热点。但许多开发者在处理该数据集时…...
猫抓cat-catch:高效媒体捕获与资源下载全指南
猫抓cat-catch:高效媒体捕获与资源下载全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch是一款专注于网页媒体资源捕…...
Claude Code 源码泄露深度剖析,Anthropic AI 编程助手的架构全解密
2026年3月31日,整个AI开发圈被一条消息炸开了锅。安全研究员Chaofan Shou(推特账号Fried_rice)在Anthropic官方发布的npm包中,意外发现了一个暴露的.map文件,正是这个看似不起眼的文件,直接泄露了Claude Co…...
Hunyuan模型如何降本增效?1.8B边缘部署实战案例分享
Hunyuan模型如何降本增效?1.8B边缘部署实战案例分享 1. 模型介绍与核心优势 混元翻译模型1.5版本带来了两个重要更新:18亿参数的HY-MT1.5-1.8B和70亿参数的HY-MT1.5-7B。这两个模型都专注于支持33种语言之间的互译,特别包含了5种民族语言及…...
PakePlus云打包入门指南:从零到一的GitHub Token配置与安全实践
PakePlus云打包入门指南:从零到一的GitHub Token配置与安全实践 【免费下载链接】PakePlus Turn any webpage/HTML/Vue/React and so on into desktop and mobile app under 5M with easy in few minutes. 轻松将任意网站/HTML/Vue/React等项目构建为轻量级(小于5M)…...
「码动四季·开源同行」go语言:统一认证与授权如何保障服务安全
认证与授权对于当前的互联网应用是非常重要的基础功能:认证用于验证当前用户的身份,而授权意味着用户在认证成功后,会被系统授予访问系统资源的权限。只有具备相应身份和权限的人才能访问系统中的相应资源,比如在购物网站中你只能…...
告别环境配置烦恼:用快马一键生成keil5兼容c51与stm32的完整安装指南
作为一名嵌入式开发者,我深知在Keil5中同时配置C51和STM32开发环境的痛苦。每次换电脑或者重装系统,都要花大半天时间折腾各种安装包、环境变量和驱动问题。最近发现InsCode(快马)平台可以一键生成完整的配置指南,简直拯救了我的开发效率。下…...
Delphi网络编程实战:UDP通信与多线程网络优化详解
前两篇文章分别讲解了Delphi中基于Indy组件的TCP点对点通信、HTTP/HTTPS接口交互,覆盖了可靠连接、Web对接两大常用场景。本篇将深入讲解UDP通信,同时补充多线程网络编程、数据传输防护、常见故障排查等进阶内容,补齐Delphi网络开发的核心模块…...
