Go viper读取配置文件的示例详解

 更新时间:2023年08月29日 10:01:04   作者:copyLeft  
这篇文章主要为大家详细介绍了Go语言如何利用viper实现读取配置文件,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

参考

viper github

API

Viper-Go一站式配置管理工具

安装

    go get github.com/spf13/viper

简单例子

/*
  目录
    - main.go
    - config.yaml
*/
func main(){
	viper.SetConfigName("config") // 设置配置名称
	viper.SetConfigFile("config.yaml") // 设置配置文件路径
    // 读取配置
	if err := viper.ReadInConfig(); err != nil{
		log.Fatal(err)
	}
    // 获取配置数据
	summary := viper.GetString("Summary")
	fmt.Println(summary)
}

新建 Viper

viper 提供默认 Viper对象, 可直接使用。 也通过 New 方法创建自定义Viper

// 直接使用默认对象
viper.GetInt("count")
// 获取全局Viper对象
globalViper := viper.GetViper()
// 新建Viper
conf := viper.New()
conf.SetConfigFile("config.yaml")

读取配置文件

从配置读取

 viper.SetConfigName("config")
 viper.SetConfigFile("config.yaml")
 if err := viper.ReadInConfig(); err != nil{
     log.Fatal(err)
 }
 version := viper.GetString("version")

从 io.Reader 读取

func main(){
    file, err := os.Open("./config.yaml")
    if err != nil{
        log.Fatal(err)
    }
    defer file.Close()
    viper.SetConfig("yaml")
    version := viper.GetString("version")
    // 这里需要设置配置类型, 否则无法正确解释配置内容
    // 如果未配置类型,也可以通过 Get 方法获取数据自行解析。
}

从 flag 读取

import (
	"fmt"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)
func main() {
	pflag.String("ip", "127.0.0.1", "Server running address")
	pflag.Int64("port", 8080, "Server running port")
	pflag.Parse()
	viper.BindPFlags(pflag.CommandLine)
	fmt.Printf("ip :%s , port:%s", viper.GetString("ip"), viper.GetString("port"))
}

获取值

值得获取方法名为 Get[type] 形式

接口类型,既未作解析

Get

布尔

GetBool

时间

  • GetDuration
  • GetTime

数字

  • GetInt
  • GetInt32
  • GetInt64
  • GetFloat64
  • GetIntSlice
  • ....

字符

  • GetString
  • GetStringSlice
  • ....

设置默认值

setDefault

 viper.setConfigFile("config.yaml")
 viper.SetDefault("port", 8000)
 println(viper.GetInt("port") // 8000
 // 这里未读取配置文件,将返回默认值

将配置映射到结构体

Unmarshal 将配置属性映射到 struct 中, 匹配模式类似 JSON 解析,只匹配大写开头的属性

type User struct{
    ID string
    Name string
    nickName string // 小写属性将不做匹配
}
func main(){
    /* config.yaml
        id: id11
        name: Rogan
        nickName: "wolf"  
    */
    ...
    user := &User{}
    viper.Unmarshal(user)
    println(&user) // { id11, Rogan } 
}

UnmarshalExact 用法与 Unmarshal 相同, 不同的是struct 必须与配置属性完全匹配,否则加报错

 /*
  config.yaml
    id: 111
    name: Rogan
 */
 type Conf_1 struct{
     Id string
     Name string
 }
 // 将报错
 type Conf_2 struct{
     Id string
 }

UnmarshalKey 匹配某一字段

 /*
  config.yaml
    server: 
        port: 8000
        host: localhost
 */
type ServerConf struct{
    Port int
    host string
}
func main(){
    ...
    serverConf := &ServerConf{}
    viper.UnmarshalKey("server", serverConfig)
}

混合配置 Merge[type]

MergeConfig

func main(){
    viper.SetConfigName("config")
	viper.SetConfigFile("config.yaml")
	viper.ReadInConfig()
	log.Println(viper.GetString("Summary"), viper.InConfig("Summary"))
	buff := []byte(`Name: jeck`)
	viper.MergeConfig(bytes.NewReader(buff))
	log.Println(viper.GetString("Name"))
}

监听文件

WatchConfig

func main(){
	viper.SetConfigName("config")
	viper.SetConfigFile("config.yaml")
	viper.ReadInConfig()
	viper.WatchConfig()
	for {
		log.Println(viper.GetString("version"))
		time.Sleep(time.Second * 5)
	}
}
// 初始 versioni: 1
// --> 1
// 修改config.yaml version: 2
// --> 2

OnConfigChange 响应配置变化

以上就是Go viper读取配置文件的示例详解的详细内容,更多关于go viper的资料请关注脚本之家其它相关文章!

相关文章

  • go语言编程学习实现图的广度与深度优先搜索

    go语言编程学习实现图的广度与深度优先搜索

    这篇文章主要为大家介绍了go语言编程学习实现图的广度与深度优先搜索示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • golang容易导致内存泄漏的6种情况汇总

    golang容易导致内存泄漏的6种情况汇总

    内存泄漏是我们在生产环境中必须面临的问题,下面这篇文章主要给大家介绍了关于golang容易导致内存泄漏的6种情况,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Golang中Delve版本太低无法Debug的问题

    Golang中Delve版本太低无法Debug的问题

    这篇文章主要介绍了Golang中Delve版本太低无法Debug的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 如何在Go中使用Casbin进行访问控制

    如何在Go中使用Casbin进行访问控制

    这篇文章主要介绍了如何在Go中使用Casbin进行访问控制,Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制
    2022-08-08
  • go的切片扩容机制详解

    go的切片扩容机制详解

    本文主要介绍了go的切片扩容机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • golang gorm中格式化时间问题详解

    golang gorm中格式化时间问题详解

    这篇文章主要给大家介绍了关于golang gorm中格式化时间问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Golang使用Decimal库避免运算中精度损失详细步骤

    Golang使用Decimal库避免运算中精度损失详细步骤

    decimal是为了解决Golang中浮点数计算时精度丢失问题而生的一个库,使用decimal库我们可以避免在go中使用浮点数出现精度丢失的问题,下面这篇文章主要给大家介绍了关于Golang使用Decimal库避免运算中精度损失的相关资料,需要的朋友可以参考下
    2023-06-06
  • golang框架gin的日志处理和zap lumberjack日志使用方式

    golang框架gin的日志处理和zap lumberjack日志使用方式

    这篇文章主要介绍了golang框架gin的日志处理和zap lumberjack日志使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • go浮点数转字符串保留小数点后N位的完美解决方法

    go浮点数转字符串保留小数点后N位的完美解决方法

    这篇文章主要介绍了go浮点数转字符串保留小数点后N位解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • golang跳转语句goto,break,continue的使用及区别说明

    golang跳转语句goto,break,continue的使用及区别说明

    这篇文章主要介绍了golang跳转语句goto,break,continue的使用及区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论