go读取yaml,json,ini等配置文件

用Go实现yaml文件节点动态解析 在大多数Go语言项目中, 配置文件通常为yaml文件格式, 在文件中可以设置项目中可灵活配置的各类参数, 通常这类参数都是比较固定的, 可以将其映射为对应的结构体在项目中进行使用, 如果需要调整参数时, 只需要增减结构体参数字段内容即可。 阅读详情

实际项目中,要读取一些json等配置文件。今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的。

一. go读取json配置文件

JSON 应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成。

  • 1.创建 conf.json:
{
  "enabled": true,
  "path": "/usr/local"
}
  • 2.新建config_json.go:
package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type configuration struct {
    Enabled bool
    Path    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 main

import (
	"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 main

import (
    "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.Name
        fmt.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 main

import (
	"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.Regex
		fmt.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 main

import (
    "fmt"
    gcfg "gopkg.in/gcfg.v1"
)

func main() {
    config := struct {
        Section struct {
            Enabled bool
            Path    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 main

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

type conf struct {
    Enabled bool   `yaml:"enabled"` //yaml:yaml格式 enabled:属性的为enabled
    Path    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 conf
    c.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 实现读写json文件(附完整源码) 阅读详情

相关推荐

Golang 解析 YAML 配置文件

其中,YAML(YAML Ain’t Markup Language)是一种人类友好的数据序列化格式,常用于配置文件的编写。首先,我们需要安装一个 YAML 解析库。在 Golang 中,有很多可供选择的库,如 go-yaml、yaml.v2 等。通过以上示例,我们可以看到,在 Golang 中解析和读取 YAML 配置文件非常简单。借助于 go-yaml 库,我们可以轻松地处理复杂的配置数据,并在应用程序中使用它们。接下来,我们开始编写 Golang 代码,解析和读取上述 YAML 配置文件的内容。

BcpiDev的博客 728

Go几种读取配置文件的方式

比较有名的方案有使用viper管理配置[1]支持多种配置文件格式,包括 JSON,TOML,YAML,HECL,envfile,甚至还包括Java properties支持为配置项设置默认值可以通过命令行参数覆盖指定的配置项支持参数别名viper[2]按照这个优先级(从高到低)获取配置项的取值:explicit call to Set: 在代码逻辑中通过viper.Set()直接设置配置项的值fl...

Go中国 1260

Go实战--go语言中使用YAML配置文件(与json、xml、ini对比)

生命不止,继续 go go go !!!golang中如何使用json在前面介绍过了: 《Go语言学习之encoding/json包(The way to go)》golang中如何使用xml在前面也有介绍过: 《Go语言学习之encoding/xml(The way to go)》json使用JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据

一蓑烟雨任平生 也无风雨也无晴 3万+

golang读取各种配置文件(ini、json、yaml)

日常项目中,读取各种配置文件是避免不了的,本文主要介绍了golang读取各种配置文件(ini、json、yaml),文中通过示例代码介绍的非常详细,对大家的学习或者工作具...

秋̶᭄ꦿ攻城狮࿆ྂ 3165

C#实战:基于ONNX与SCRFD/ArcFace的高效人脸识别系统开发

本文详细介绍了如何在C#环境中,利用ONNX Runtime高效部署SCRFD人脸检测与ArcFace人脸识别模型,构建一个完整的、高性能的人脸识别系统。内容涵盖环境搭建、模型推理、人脸对齐、特征提取等核心模块,并提供了从Demo到生产系统的优化思路与实战代码,为.NET开发者提供了一套开箱即用的解决方案。

weixin_29061821的博客 488

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 925

如何读取yaml,json,ini等配置文件【Golang 入门系列九】

如何读取yaml,json,ini等配置文件【Golang 入门系列九】一. go读取json配置文件二、 go读取.ini配置文件三、go读取yaml配置文件 本文转载自如何读取yaml,json,ini等配置文件【Golang 入门系列九】 前面已经讲过一些Go语言的基础知识,感兴趣的朋友可以先看看之前的文章。https://www.cnblogs.com/zhangweizhong/category/1275863.html。 实际项目中,还有一个比较重要的基础功能,就是读取相关的配置文件。今天就来说

ccf19881030的专栏 789

64.企业级案例(上)-金融行业DDD落地全流程支付系统-附架构演进图

本文以金融支付系统为例,完整展示了DDD在企业级项目中的落地流程。首先通过事件风暴识别核心业务领域,包括交易、渠道、账务等限界上下文。在战略设计中划分上下文边界,确定交易上下文为核心域。战术设计聚焦交易上下文,详细设计了支付单聚合、值对象和支付路由服务。架构实现采用CQRS+EDA模式,通过命令端处理交易,查询端异步更新读模型,并利用防腐层隔离外部渠道。案例展示了DDD从业务探索到架构实现的全过程,体现了其在复杂业务系统中的价值。

yonggeit的博客 3033

Go语言实战-golang读取各种配置文件(ini、json、yaml)

golang读取各种配置文件,ini、json、yaml

qq_36034503的博客 5661

【纯干货分享】常用高速接口眼图模板合集

文章汇集了常见的高速接口的信号眼图测试模板技术要求,比如,LPDDR5/4、PCIe 5.0/4.0、USB、MIPI等等,方便工程师快速进行查询和使用。

一只豌豆象的博客 3116

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

Golang 入门系列(九) 如何读取YAML,JSON,INI等配置文件

实际项目中,读取相关的系统配置文件是很常见的事情。今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的。 1. json使用 JSON 应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成。   1. 创建 conf.json: { "enabled": true, "path": "/usr/lo...

weixin_30929011的博客 140

华为OD机试双机位C卷:挑选宝石 (C/C++/Python/JAVA/JS/GO)

华为OD机试双机位C卷 挑选宝石,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-挑选宝石,华为OD机考-挑选宝石。

qq_45776114的博客 1500

Windows 安装 RabbitMQ:Erlang OTP 匹配与启动排查

消息队列是分布式系统中实现异步通信、流量削峰与系统解耦的基础设施,AMQP 则为其提供标准化消息路由能力。RabbitMQ 以 Erlang/OTP 为运行时底座,在 Windows 上没有包管理器自动解决依赖,OTP 版本、环境变量、服务账号与 cookie 一致性会直接影响节点启动。理解这些机制,能减少 nodedown、15672 管理界面打不开、epmd 端口冲突等联调成本。它适用于微服务异步任务、日志采集、IoT MQTT 接入以及前后端消息推送等场景。围绕 Windows 下的 Erlang/O

weixin_34357436的博客 524

Claude Code 学习笔记之一:理解 Agentic Loop 与内置工具

本文介绍了Claude Code这一终端智能助手的工作原理与使用方式。作者从ABAP开发经验出发,指出学习Claude Code的高级用法具有长期价值。文章详细解析了Claude Code的Agentic Loop机制:通过大语言模型进行推理,借助各类工具执行任务,并循环收集上下文、执行操作、验证结果三个步骤。系统阐述了Claude Code支持的五大类工具及其扩展方式,说明了其访问本地资源的范围和自治处理能力,同时介绍了权限模式等安全机制。最后提供了从小任务开始、充分探索、及时引导、使用CLAUDE.md

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 541

apollo-慢速车向左绕行

当主车前方出现其他车辆时,通过左侧车道对前车绕行。

是菜鸟o的博客 309

Go开发学习 | 如何快速读取json/yaml/ini等格式的配置文件使用示例

描述: 作为开发者相信对应用程序的配置文件并不陌生吧,例如 Java Spring Boot 里的 class 目录中程序配置,当然go语言相关项目也是可以根据配置文件的格式内容进行读取的,常规的配置文件格式有 json、ini、yaml (个人推荐)、properties 等,我们可以使用其为程序配置一些初始化的可变参数,例如 数据库字符串链接以及认证密码等等。好,下面作者将依次从json、ini、以及yaml、properties 等顺序进行讲解。0x01 常用模块。

全栈工程师修炼指南-IT知识分享 2213

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Go-如何读取yaml,json,ini等配置文件

1. json使用 JSON 应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成。 创建 conf.json: { "enabled": true, "path": "/usr/local" } 新建config_json.go: package main import ( "encoding/json" ...

weixin_30445169的博客 417

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GoLang 使用goconfig读取配置文件(.ini、.json、.yaml)

一、goconfig读取.ini类型配置文件 1、配置文件(config.ini)如下: [RabbitMQ] MQUrl = amqp://trkj:trkj@192.168.5.62:5672/test Exchange = EX.WALLDATA ExchangeType = fanout RoutingKey = RK.WALLDATA [Base] messageFrequency = 5 2、解析配置文件: package main import (

✍Snoring cat 2124

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

go linux 配置文件,Golang 项目之配置文件

相信对于很多gopher 而言, 我这篇文章,算比较初级,我是一个一年多经验的golang程序员,有着5年左右的编程经验。golang 对于初学者还算友好, 写代码很好入门, 但业界对于golang工程与项目的BP却比较缺少,或者是有很多方为此争论不休,就比依赖管理工具就搞出了许多个,如 知名的有dep, vgo和golang 官方的 go module, 也可能是我所知有限的缘故, 希望大家不吝...

weixin_30722051的博客 795

golang几种常用配置文件使用方法总结(yaml、toml、json、xml、ini)

yaml配置文件的使用方法总结 首先介绍使用yaml配置文件,这里使用的是github上第三方开源gopkg.in/yaml.v2 第一步:下载 go get gopkg.in/yaml.v21 第二步:新建一个yaml文件,比如conf.yaml host: localhost:3306 user: root pwd: 123456 dbname: test1234 特别需要强调的是冒号...

TigerwolfC的博客 4万+

Go语言读取多种格式配置文件

今天向大家介绍一个关于Go读取配置文件的相关Tool,他就是:Viper GitHub链接:https://github.com/spf13/viper/ 1 简介 Viper是一个完整的配置解决方案,包括12因素应用程序。它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持: 设置默认值 读取JSON, TOML, YAML, HCL, envfile和Java属性配置文件 实时观看和读取配置文件(可选) 从环境变量中读取 读取远程配置系统(etcd或Consul),并观察变化

做兴趣使然的Hero 2199
上一篇: go读取文件的几种方法
下一篇: 问脉基础调研
Cc_sec
博客等级 码龄8年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值