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上有很多优秀的第三方库开源给我们使用。

    1. 创建 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 入门系列九】-腾讯云开发者社区-腾讯云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/61434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高性能JavaScript

管理浏览器中的JavaScript代码是个棘手的问题&#xff0c;因为代码执行阻塞了其他浏览器处理过程&#xff0c;注入用户界面回执。每次遇到 < script > 便签&#xff0c;页面必须停下来等待代码下载&#xff08;如果是外部的&#xff09;并执行&#xff0c;然后再继续处理…

基于战争策略算法优化的BP神经网络(预测应用) - 附代码

基于战争策略算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于战争策略算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.战争策略优化BP神经网络2.1 BP神经网络参数设置2.2 战争策略算法应用 4.测试结果&#xff1a;5…

【Centos8_配置单节点伪分布式Spark环境】

安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接&#xff1a; jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk&#xff08;java8&#xff09; # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …

【Apollo学习笔记】——规划模块TASK之SPEED_BOUNDS_PRIORI_DECIDER

文章目录 前言SPEED_BOUNDS_PRIORI_DECIDER功能简介SPEED_BOUNDS_PRIORI_DECIDER相关配置SPEED_BOUNDS_PRIORI_DECIDER流程将障碍物映射到ST图中ComputeSTBoundary(PathDecision* path_decision)ComputeSTBoundary(Obstacle* obstacle)GetOverlapBoundaryPointsComputeSTBounda…

Docker搭建私有仓库并迁移

目录 方案 A、B机器安装docker 设置阿里云镜像源 安装 Docker-CE并设置为开机自动启动 A机器准备数据 拷贝数据 B机器运行redis、mysql镜像 重启docker服务 方案 准备两台机器&#xff1a;A机器&#xff08;可以连接外网&#xff09;&#xff0c;B机器&#xff08;内网机器…

图床项目进度(二)——动态酷炫首页

前言&#xff1a; 前面的文章我不是说我简单copy了站友的一个登录页吗&#xff0c;我感觉还是太单调了&#xff0c;想加一个好看的背景。 但是我前端的水平哪里够啊&#xff0c;于是在网上找了找制作动态背景的插件。 效果如下图。 如何使用 这个插件是particles.js 安装…

使用图集SpriteAtlas时,根据其中的Sprite,给 RawImage 设置 texture 的两种方法

当使用图集 SpriteAtlas 时&#xff0c; 从中获取的 Sprite 的 texture 是图集中整张图片&#xff0c;为了给 RawImage 设置 Texture&#xff0c;有两种方式&#xff1a; 方式1&#xff1a;使用以下扩展函数&#xff0c;其原理是给 RawImage 设置整张纹理&#xff0c;然后设置…

C语言入门篇(九)

前言   本篇分享的是部分操作符的概念与用法&#xff0c;从经典例题入手&#xff0c;带你快速了解和掌握。   收录专栏&#xff1a;浅谈C语言 操作符详解下 10. 逗号表达式11. 下标引用、函数调用和结构成员12. 表达式求值12.1 隐士类型转换12.2 算术转换12.3 操作符的属性…

多项式求逆

已知 F F F&#xff0c;求 G G G 考虑倍增 F ( x ) ∗ H ( x ) ≡ 1 ( m o d x n / 2 ) F(x) * H(x) \equiv 1 \pmod{x^{n/2}} F(x)∗H(x)≡1(modxn/2) F ( x ) ∗ G ( x ) ≡ 1 ( m o d x n / 2 ) F(x) * G(x) \equiv 1 \pmod{x^{n/2}} F(x)∗G(x)≡1(modxn/2) 假设 H H…

最大子数组和【贪心算法】

最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 class Solution {public int maxSubArray(int[] nums) {//记录最大结果&…

Linux土遁术之监测监测进程打开文件

分析问题过程中&#xff0c;追踪进程打开的文件可以在许多不同情况下有用&#xff0c;体现在以下几个方面&#xff1a; 故障排除和调试&#xff1a; 当程序出现问题、崩溃或异常行为时&#xff0c;追踪进程打开的文件可以帮助您找出问题的根本原因。这有助于快速定位错误&…

基于Spring Boot的住院病人管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的住院病人管理系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

前列腺小体外泄蛋白(PSEP)——博迈伦

前列腺小体外泄蛋白&#xff08;Prostate-specific extracellular vesicle protein&#xff0c;简称PSEP&#xff09;是一种在前列腺细胞分泌的小体外囊泡中出现的蛋白质。小体外泌物指的是由细胞分泌的膜包裹小体&#xff0c;其中包含多种生物活性物质&#xff0c;如蛋白质、R…

springboot aop实现接口防重复操作

一、前言 有时在项目开发中某些接口逻辑比较复杂&#xff0c;响应时间长&#xff0c;那么可能导致重复提交问题。 二、如何解决 1.先定义一个防重复提交的注解。 import java.lang.annotation.*;Inherited Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Do…

vue三级市区联动

默认返回值格式&#xff1a;all:code、name都返回 name:只返回name code:只返回code&#xff0c;level&#xff1a;可设置显示层级 1&#xff1a; 省 2&#xff1a; 省、市 3&#xff1a; 省、市、区 v-model 默认值 可以是 name: [ "天津市", "天津市",…

Debian 30 周年,生日快乐!

导读近日是 Debian 日&#xff0c;也是由伊恩-默多克&#xff08;Ian Murdock&#xff09;创立的 Debian GNU/Linux 通用操作系统和社区支持的 Debian 项目 30 周年纪念日。 不管你信不信&#xff0c;从已故的伊恩-默多克于 1993 年 8 月 16 日宣布成立 Debian 项目&#xff0c…

C# 练习题

26. Enum(枚举) /*枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。C# 枚举是值类型。换句话说&#xff0c;枚举包含自己的值&#xff0c;且不能继承或传递继承。 */using System;public class EnumTest {enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };static…

CentOS 7 Nacos 设置开机自动重启

一、说明 Nacos如果是手动启动的话&#xff0c;在服务器宕机或者重启后&#xff0c;没有自动运行&#xff0c;影响很多业务系统&#xff0c;需要每次手动执行命令 startup.sh -m standalone&#xff0c;才能启动 Nacos 服务&#xff0c;不能像docker服务一样&#xff0c;使用 …

博客系统后端(项目系列2)

目录 前言 &#xff1a; 1.准备工作 1.1创建项目 1.2引入依赖 1.3创建必要的目录 2.数据库设计 2.1博客数据 2.2用户数据 3.封装数据库 3.1封装数据库的连接操作 3.2创建两个表对应的实体类 3.3封装一些必要的增删改查操作 4.前后端交互逻辑的实现 4.1博客列表页 …

【ES】elasticsearch8.3.3

这里仅实践操作并根据实际问题进行记录笔记。 运行 ES8 我们需要在自己的电脑上安装好 Docker Desktop。接着我们运行如下的命令&#xff1a;出现两个异常&#xff0c;一个是需要使用winpty因为我使用win的docker desktop&#xff0c;另外一个问题是docker启动elasticsearchE…