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

这篇具有很好参考价值的文章主要介绍了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 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 入门系列九】-腾讯云开发者社区-腾讯云文章来源地址https://www.toymoban.com/news/detail-688604.html

到了这里,关于go读取yaml,json,ini等配置文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(70)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(47)
  • Yaml配置文件读取方法

    在日常的代码中,有一些值是配置文件中定义的,这些值可以根据用户的要求进行调整和改变。这往往会写在yaml格式的文件中。这样开放程序给用户时,就可以不必开放对应的源码,只开放yaml格式的配置文件即可。 将配置文件中的值读入程序也非常的简单。 我们先写一个简

    2024年02月11日
    浏览(27)
  • 【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(55)
  • 【go语言】读取toml文件

    TOML,全称为Tom\\\'s Obvious, Minimal Language,是一种易读的配置文件格式,旨在成为一个极简的数据序列化语言。TOML的设计原则之一是保持简洁性,易读性,同时提供足够的灵活性以满足各种应用场景。 TOML文件由多个表(table)组成,每个表包含一组键值对。键值对由键名、等号(

    2024年01月15日
    浏览(31)
  • NetCore读取JSON配置文件

    一、添加NuGet 包: 1. Microsoft.Extensions.Configuration.Binder :将对象与 Microsoft.Extensions.Configuration 的配置提供程序中的数据绑定的功能。 2. Microsoft.Extensions.Configuration.Json :Microsoft.Extensions.Configuration 的 JSON 配置提供程序实现。 3. Microsoft.Extensions.Configuration.EnvironmentVariables :Microso

    2024年02月05日
    浏览(25)
  • Go语言(Golang)安装下载配置及debug调试

    与Java类似,Go语言使用前也需要安装开发环境,并配置环境变量。下面以Windows平台为例,演示整体流程。 官方网站可能访问不到 https://golang.org/,可以访问国内镜像网站下载Go安装包: https://studygolang.com/dl https://mirrors.nju.edu.cn/ 因为Go语言一直的迭代,入门时尽量选择较新的版

    2024年02月04日
    浏览(48)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(60)
  • python读取ini文件

    python+pytest做接口测试时,通常需要把环境的配置信息(如不同环境的IP,数据库的连接信息等)保存在ini文件中,方便切换和维护。 这里来记录一下ini文件的读取方法。 #ini文件的读取依赖的包为 configparser。 这样config就会返回整个ini文件的内容。 [host] ;api_sit_url = https://api

    2024年02月12日
    浏览(35)
  • C# 读取ini文件示例

    一般使用一个相关win32 api的封装类;我用的如下; C#, 运行; ini文件; [mymoney1] moneyname=jintiao moneycount=9999  

    2024年01月18日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包