golang读取yaml配置文件的方法实现

 更新时间:2024年10月25日 09:45:26   作者:code:404-not-found  
本文主要介绍了golang读取yaml配置文件的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Viper

Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:

  • 设置默认值
  • 从JSON、TOML、YAML、HCL、envfile和Java properties 格式的配置文件读取配置信息
  • 实时监控和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd或Consul)读取并监控配置变化
  • 从命令行参数读取配置
  • 从buffer读取配置
  • 显式配置值

安装

go get github.com/spf13/viper

使用

在项目根目录创建config文件夹,在文件夹中创建local.yaml

servername: 'myserver'

mysql:
  name: 'mysql'

在main.go中读取配置文件的信息

package main

import (
	"log"

	"github.com/spf13/viper"
)

func main() {
	v := viper.New()

	// 设置文件名称
	v.SetConfigFile("./config/local.yaml")

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("读取配置文件失败")
	}

	servername := v.Get("servername")
	mysql := v.Get("mysql.name")
	log.Println(servername, mysql)
}

使用结构体映射yaml

修改配置文件

name: '服务名'
port: 8080

使用

package main

import (
	"log"

	"github.com/spf13/viper"
)

type ServerConfig struct {
	Name string `mapstructure:"name"`
	Port int    `mapstructure:"port"`
}

func main() {

	cfg := ServerConfig{}
	v := viper.New()

	// 设置文件名称
	v.SetConfigFile("./config/local.yaml")

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("读取配置文件失败")
	}

	if err := v.Unmarshal(&cfg); err != nil {
		log.Panicln(err)
	}

	log.Println(cfg)
}

输出

{服务名 8080}

结构体嵌套读取配置

配置文件

name: '服务名'
port: 8080
mysql: 
  host: '127.0.0.1'
  port: 3306

读取配置

package main

import (
	"log"

	"github.com/spf13/viper"
)

type ServerConfig struct {
	Name        string      `mapstructure:"name"`
	Port        int         `mapstructure:"port"`
	MysqlConfig MysqlConfig `mapstructure:"mysql"` // 嵌套的配置
}

type MysqlConfig struct {
	Host string `mapstructure:"host"`
	Port int    `mapstructure:"port"`
}

func main() {

	cfg := ServerConfig{}
	v := viper.New()

	// 设置文件名称
	v.SetConfigFile("./config/local.yaml")

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("读取配置文件失败")
	}

	if err := v.Unmarshal(&cfg); err != nil {
		log.Panicln(err)
	}

	log.Println(cfg)
}

输出

{服务名 8080 {127.0.0.1 3306}}

根据不同环境读取不同配置文件

在实际开发工作中,一般有不同的开发环境,会涉及到读取不同的配置文件

这会运用的golang的flag包

package main

import (
	"flag"
	"log"
)


func main() {

	env := flag.String("env", "local", "运行环境请输入local dev test prod")
	flag.Parse()

	log.Println("当前环境是" + *env)

}

运行

go run .\main.go -help

输出

-env string
运行环境请输入local dev test prod (default "local")

这样的话运行

go run .\main.go -env dev

输出

当前环境是dev

利用flag读取不同环境的配置文件

在项目更目录新建config文件夹

并创建4个配置文件 local.yaml dev.yaml test.yaml prod.yaml

其中dev.yaml中

name: 'dev服务名'
port: 8080
mysql: 
  host: '127.0.0.1'
  port: 3306

在main.go中

package main

import (
	"flag"
	"fmt"
	"log"

	"github.com/spf13/viper"
)

type ServerConfig struct {
	Name        string      `mapstructure:"name"`
	Port        int         `mapstructure:"port"`
	MysqlConfig MysqlConfig `mapstructure:"mysql"` // 嵌套的配置
}

type MysqlConfig struct {
	Host string `mapstructure:"host"`
	Port int    `mapstructure:"port"`
}

func main() {

	env := flag.String("env", "local", "运行环境请输入local dev test prod")
	flag.Parse()

	log.Println("当前环境是" + *env)

	cfg := ServerConfig{}
	v := viper.New()
	var path string = fmt.Sprintf("./config/%s.yaml", *env)
	// 设置文件名称
	v.SetConfigFile(path)

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("读取配置文件失败")
	}

	if err := v.Unmarshal(&cfg); err != nil {
		log.Panicln(err)
	}

	log.Println(cfg)
}

运行

go run .\main.go -env dev

输出

当前环境是dev
{dev服务名 8080 {127.0.0.1 3306}}

到此这篇关于golang读取yaml配置文件的方法实现的文章就介绍到这了,更多相关golang读取yaml内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go mod 依赖管理的具体使用

    go mod 依赖管理的具体使用

    在Go语言开发中,依赖管理是一项非常重要的工作,Go mod作为官方的包管理工具已经成为了Go语言依赖管理的首选方式,本文就来介绍一下go mod 依赖管理的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • GoLang中panic和recover作用详解

    GoLang中panic和recover作用详解

    panic 和 recover 是 Go 语言中用于处理异常和错误的机制,能够帮助我们应对意外情况并使程序更加健壮,这篇文章主要介绍了GoLang中panic和recover作用详解,需要的朋友可以参考下
    2024-05-05
  • Golang应用执行Shell命令实战

    Golang应用执行Shell命令实战

    本文主要介绍了Golang应用执行Shell命令实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言中:= 运算符短变量声明的使用小结

    Go语言中:= 运算符短变量声明的使用小结

    本文全面解析Go语言特有的:=运算符,该运算符兼具变量声明和初始化功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Go疑难杂症讲解之为什么nil不等于nil

    Go疑难杂症讲解之为什么nil不等于nil

    在日常开发中,可能一不小心就会掉进 Go 语言的某些陷阱里,而本文要介绍的 nil ≠ nil 问题,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-10-10
  • 一文详解Go语言单元测试的原理与使用

    一文详解Go语言单元测试的原理与使用

    Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试。本文将通过示例详细聊聊Go语言单元测试的原理与使用,需要的可以参考一下
    2022-09-09
  • golang实现命令行程序的使用帮助功能

    golang实现命令行程序的使用帮助功能

    这篇文章介绍了golang实现命令行程序使用帮助的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 使用golang实现在屏幕上打印进度条的操作

    使用golang实现在屏幕上打印进度条的操作

    这篇文章主要介绍了使用golang实现在屏幕上打印进度条的操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Go语言使用sqlx操作MySQL

    Go语言使用sqlx操作MySQL

    sqlx 包作为一个扩展库,它在 database/sql 的基础上,提供了更高级别的便利,极大地简化了数据库操作,本文章将介绍如何通过sqlx包来操作 MySQL 数据库,感兴趣的可以了解下
    2024-11-11
  • 详解Go strconv包

    详解Go strconv包

    Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换。这篇文章主要介绍了Go strconv包的相关知识,需要的朋友可以参考下
    2020-10-10

最新评论