首页 > 其他分享 >Viper基本操作

Viper基本操作

时间:2024-01-30 15:22:40浏览次数:20  
标签:配置文件 Get fmt server Viper Println 基本操作 viper

一、概述

  Viper主要是操作:

    1.读取命令行参数

    2.读取环境变量

    3.读取配置文件

    这比配置参数直接写在代码中方便的多,而且还支持配置热加载

  导入viper

go get -u github.com/spf13/viper

 

二、代码示例

  1.在代码中读取设置默认配置

// 读取默认配置
func main001() {
    //设置viper默认配置
    viper.SetDefault("username", "tony")
    viper.SetDefault("server", map[string]string{"ip": "127.0.0.1", "port": "8888"})

    //读取默认配置
    fmt.Println("username:", viper.Get("username"))
    fmt.Println("server:", viper.Get("server"))

    //从配置文件中读取配置

    fmt.Println("Hello World!")
}

  2.解析配置文件:config.yaml

func main002() {
    // flag.Parse() //解析命令行参数

    // viper.SetConfigFile("config.yaml")
    // if *cfg != "" {
    viper.SetConfigFile("config.yaml")
    //如果配置文件没有后缀,则主动指定文件后缀
    // viper.SetConfigType("yaml")
    // } else {
    // viper.AddConfigPath(".")                  //把当前目录加入到配置文件的搜索路径中
    // viper.AddConfigPath("$HOME/.config.yaml") //可以多次调用AddConfigPath来设置多个配置文件路径
    // viper.SetConfigName("config")             //指定配置文件扩展名(如果没有扩展名)
    // }

    //读取配置文件

    if err := viper.ReadInConfig(); err != nil {
        if _, ok := err.(viper.ConfigFileNotFoundError); ok {
            fmt.Println(errors.New("config file not found"))
        } else {
            fmt.Println(errors.New("config file was found but another error was product"))
        }
        return
    }
    fmt.Println("viper.ConfigFileUsed", viper.ConfigFileUsed()) //读取配置文件的路径
    //读取配置值
    fmt.Println("username", viper.Get("username"))
    fmt.Println("password", viper.Get("password"))
    fmt.Println("server", viper.Get("server"))
    server := viper.Get("server")
    serverMap, ok := server.(map[string]interface{}) //把Server转换成为一个map
    if !ok {
        fmt.Println("类型转换失败")
        return
    }
    fmt.Println("ip", serverMap["ip"])
    fmt.Println("port", serverMap["port"])
    fmt.Println("ip2", viper.Get("server.ip"))
    fmt.Println("port2", viper.Get("server.port"))

    // serverMap,ok:=viper.Get("server").(map[string]interface)
    // fmt.Println("ip", viper.Get("server")["ip"])
    // fmt.Println("port", viper.Get("server")["port"])

}

  3.监控并重新配置文件(热加载)

// 监控并重新读取配置文件(热加载),这块已经做了测试可以正常的读取变化后的内容
func main003() {
    viper.SetConfigFile("config.yaml") //加载配置文件
    viper.ReadInConfig()

    //注册回调函数:每次配置文件发生变更的时候回调
    viper.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("配置文件发生变化", e.Name)
    })
    //监控并重新读取配置文件,需要确保调用前添加了所有配置路径
    viper.WatchConfig()

    time.Sleep(time.Second * 10) //主要是观察输出用的

    //读取配置信息
    fmt.Println("server.ip", viper.Get("server.ip"))
    fmt.Println("username", viper.Get("username"))

}

  4.从io.Reader中读取配置

// 从io.Reader中读取配置
func main004() {
    viper.SetConfigType("yaml")
    var yamlExample = []byte(`
username: 杨洛峋
password: 123456
server:
  ip: 127.0.0.1
  port: 8289
`)
    viper.ReadConfig(bytes.NewBuffer(yamlExample))
    //读取配置信息
    fmt.Println("username", viper.Get("username"))
    fmt.Println("password", viper.Get("password"))
    fmt.Println("server.ip", viper.Get("server.ip"))
    fmt.Println("server.port", viper.Get("server.port"))
}

  5.读取子树

// 提取子树
func main005() {
    viper.SetConfigFile("config.yaml")
    viper.ReadInConfig()

    //提取子树
    subConf := viper.Sub("server")
    fmt.Println("ip", subConf.Get("ip"))
    fmt.Println("port", subConf.Get("port"))
}

  6.反序列化

//反序列化
type Config struct {
    UserName string
    Password string
    Server   struct {
        IP   string
        Port int
    }
}

func main006() {
    //加载并读取配置文件
    viper.SetConfigFile("config.yaml")
    viper.ReadInConfig()

    //将配置文件序列化到Config结构体中
    var cfg *Config
    if err := viper.Unmarshal(&cfg); err != nil { //反序列化所有配置项
        panic(err)
    }

    var password *string
    if err := viper.UnmarshalKey("password", &password); err != nil { //反序列化指定配置项(这里指定的是password)
        panic(err)
    }

    //获取反序列化所有配置项的结果
    fmt.Println("config", cfg)
    fmt.Println("username", cfg.UserName)
    fmt.Println("password", cfg.Password)
    fmt.Println("IP", cfg.Server.IP)
    fmt.Println("Port", cfg.Server.Port)

    //获取序列化指定配置项的结果
    fmt.Println("password", *password)

}

  7.Viper多实例测试

// viper多实例测试(切换开发环境、测试环境、生产环境)
func main() {
    viper.SetConfigFile("config.yaml")
    err := viper.ReadInConfig()
    if err != nil {
        fmt.Println("读取配置文件失败")
        return
    }

    mType := viper.Get("type")
    fmt.Println("mType", mType)
    if mType == 1 {
        fmt.Println("开发环境")
        dev := viper.New()
        dev.SetConfigFile("dev.yaml")
        dev.ReadInConfig()
        fmt.Println("dev->username", dev.Get("username"))
    } else if mType == 2 {
        fmt.Println("测试环境")
        uat := viper.New()
        uat.SetConfigFile("uat.yaml")
        uat.ReadInConfig()
        fmt.Println("uat->username", uat.Get("username"))
    } else if mType == 3 {
        pro := viper.New()
        pro.SetConfigFile("pro.yaml")
        pro.ReadInConfig()
        fmt.Println("pro->username", pro.Get("username"))
        fmt.Println("生产环境")
    }
}

 

标签:配置文件,Get,fmt,server,Viper,Println,基本操作,viper
From: https://www.cnblogs.com/tony-yang-flutter/p/17997189

相关文章

  • 快乐学Python,DataFrame的基本操作
    在上一篇文章中,我们了解了如何使用pandas的函数来从多种数据源:csv、excel和html网页。其中不管是哪一种数据读取的方式,最终返回的都是一个DataFrame对象。对于DataFrame对象,我们只是简单将其打印出来,这一篇我们来学习围绕DataFrame的基本操作(添加行、列,删除行、列,排序......
  • Linux 系统安装的基本操作
    Linux基本安装方法 centos6.4 这里为大家介绍Linux的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建,也可以直接买一台学习用用,参考各大云服务器比较。本次以centos6.4为例。 centos下载地址:可以去官网下载最新版本:https://www.cento......
  • css变量基本操作
    1.html中css变量写法<divstyle="--color:#ccc;"><spanstyle="border:1pxsolidvar(--color);"></div><ul><listyle="--i:1"></li><listyle="--i:2"></li>......
  • Go语言核心36讲 10 | 通道的基本操作
    作为Go语言最有特色的数据类型,通道(channel)完全可以与goroutine(也可称为go程)并驾齐驱,共同代表Go语言独有的并发编程模式和编程哲学。Don’tcommunicatebysharingmemory;sharememorybycommunicating.(不要通过共享内存来通信,而应该通过通信来共享内存。)这是作为Go语言......
  • java线程的基本操作
    1.线程名称的设置和获取在Thread类中可以通过构造器Thread(...)初始化设置线程名称,也可以通过setName(...)实例方法去设置线程名称,取得线程名称可以通过getName()方法完成。关于线程名称有以下几个要点:线程名称一般在启动线程前设置,但也允许为运行的线程设置名称......
  • 五子棋1 - 基本操作和胜负判断
    效果 胜负的判断直接用的暴力的方式,以落子为中心水平方向前后4个,垂直方向上下4个,2个对角线斜角前后4个 这样判断的,这个数量是固定的,不会随着棋盘的变大而变大,所以还好。 publicclassGoBangTest:MonoBehaviour,IPointerClickHandler{publicTextm_TimeBl......
  • 计价软件教程-鹏业云计价i20(江苏)审核基本操作
    鹏业云计价i20(江苏)审核基础操作一、审核的概念与目标工程造价审核的概念:是指对建设项目全部成本的真实性、合法性进行的审查和评价;工程造价审核的目标主要包括:检查工程价格结算与实际完成的投资额的真实性、合法性;检查是否存在虚列工程、套取资金、弄虚作假、高估冒算的行为;二、......
  • git的常见基本操作
    一:概述git是开源的、免费的分布式版本控制系统,可以有效的高速的处理,从很小到非常大的项目版本管理。它的一些基本操作,需要使用者去掌握。二:具体说明<1>gitclone这个命令的作用是克隆远程版本到本地。gitcloneurl克隆远程版本仓库<2>gitcheckout-bdev克隆完之后,如果需要新建......
  • Hive基本操作
     Hive的基本操作很简单,与SQL的写法很类似,总结如下:  进入Hive环境     $HIVE_HOME/bin/hive  数据库操作       CREATE(DATABASE|SCHEMA)[IFNOTEXISTS]database_name[COMMENTdatabase_comment][LOCATIONhdfs_path][WITHDBPROPERTIE......
  • 【数据结构】C语言实现双链表的基本操作
    双链表导言大家好,很高兴又和大家见面啦!!!经过前面几个篇章的内容分享,相信大家对顺序表和单链表的基本操作都已经熟练掌握了。今天咱们将继续分享线性表的链式存储的第二种形式——双链表。在今天的内容中,咱们将介绍双链表的创建以及一些基本操作,接下来跟我一起来看看吧!一、单链表与双......