(2)go web开发之 使用viper读取配置文件

Go语言学习笔记——配置管理库viper viper是一个golang配置管理库,很多项目都使用viper来构建,例如:docker、Hugo等等 阅读详情

介绍

  • 什么是 viper?
    • viper 是一个完整的配置解决方案,包括12-Factor apps。它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:
      • 设置默认值
      • 时时监控和重新读取配置文件
      • 从环境变量中读取
      • 从远程配置系统(etcd或Consul)读取并监听配置变化
      • 从命令行读取配置
      • 显示配置值
    • 可查看官方介绍:https://github.com/spf13/viper, 包括下载安装。上述介绍来自这里开篇
      在这里插入图片描述
  • 为什么使用 viper?
    • 也有官方有介绍优势:
      在这里插入图片描述
    • 能为你做这些:
      • 查找,加载,反序列化上述格式的配置文件。
      • 提供一种机制为你的不同配置选项设置默认值
      • 提供一种机制来通过命令行参数覆盖指定选项值
      • 提供别名系统,以便在不破坏现有代码的情况下,轻松重命名参数
      • 当用户提供了与默认值相同的命令行参数或配置文件时,可以很容易分辨它们之间的区别。
    • viper 按照下面的优先级,每以项都优先于它下面的一项:
      • (1)显示调用 Set设置值
      • (2)命令行参数flag
      • (3)环境变量
      • (4)配置文件
      • (5)key/value存储
      • (6)默认值
    • 另外,目前viper配置的key 是不区分大小写的。

使用

  • 下面的介绍,都是按照上面链接中,官方文档的顺序进行的。细节和小问题,可以直接对照着找到官方文档的讲解。

1. 设置默认值: Establishing Defaults

  • 文档介绍完毕的下方,就是演示设置默认值了:
    • 使用: func SetDefault(key string, value interface{})
      import "github.com/spf13/viper"
      
      func main() {
      	// 设置当前的主文件目录, main.go 所在的位置
      	viper.SetDefault("main", "D:\\gofiles\\go-learning-notes\\go-learning\\zap日志库")
      	// 因为是个接口类型的values,所以还可以这样设置
      	viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
      }
      

2. 读取配置文件:Reading Config Files

  • 官方介绍:

    • 2 Viper需要最少的配置,所以它知道在哪里查找配置文件。Viper支持JSON、TOML、YAML、HCL、INI、envfile和Java Properties文件。Viper可以搜索多个路径
    • 注意这里:SetConfigType("yaml") : 这是针对从远程获取文件的时候,用来判断文件的类型。 当本地运行时 ,这一句是不生效的。 只会执行 SetConfigName(“config”) 查找这个文件名的配置。
      • 如果既有 config.yaml 还有 config.json 此时读取就会造成混乱!
      • 解决方法是使用: SetConfigFile("config.json") ,明确指定是哪个文件。
  • 展示:

    // 配置文件名, 不加扩展
    viper.SetConfigName("config") // name of config file (without extension)
    // 设置文件的扩展名
    viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name
    // 查找配置文件所在路径
    viper.AddConfigPath("/etc/appname/")   // path to look for the config file in
    // 可以调用多次,添加多个配置文件路径
    viper.AddConfigPath("$HOME/.appname")  // call multiple times to add many search paths
    // 在当前路径进行查找
    viper.AddConfigPath(".")               // optionally look for config in the working directory
    
    // 开始查找并读取配置文件
    err := viper.ReadInConfig() // Find and read the config file
    if err != nil { // Handle errors reading the config file
    	panic(fmt.Errorf("Fatal error config file: %w \n", err))
    }
    
    • 在当前路径下创建查找,会依次从配置的路径查找
      在这里插入图片描述

    • 可以按照这种写法,处理特定的找不到配置文件的情况

      if err := viper.ReadInConfig(); err != nil {
      	if _, ok := err.(viper.ConfigFileNotFoundError); ok {
      		// Config file not found; ignore error if desired
      	} else {
      		// Config file was found but another error was produced
      	}
      }
      

3. 写配置文件:Writing Config Files

  • 官方介绍场景作用:从配置文件中读取是有用的,但有时您希望存储在运行时所做的所有修改。为此,有一堆命令可用,每个命令都有自己的目的。

  • 命令介绍

    • WriteConfig -将当前的viper配置写到预定义的路径(如果存在的话)。如果没有预定义的路径,将出现错误。将覆盖当前配置文件,如果它存在。
    • SafeWriteConfigAs——将当前的viper配置写到给定的文件路径。将不会覆盖给定的文件,如果它存在。
    • WriteConfigAs -将当前的viper配置写到给定的文件路径。将覆盖给定的文件,如果它存在。
    • SafeWriteConfig -写入当前的毒蛇配置到预定义的路径。如果没有预定义的路径,将出现错误。不会覆盖当前配置文件,如果它存在。
  • 展示:

    // 将当前的配置写入 'viper.AddConfigPath()' and 'viper.SetConfigName' 设置的文件
    viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName'
    // 安全写,不会覆盖
    viper.SafeWriteConfig()
    // 写到另一个配置文件
    viper.WriteConfigAs("/path/to/my/.config")
    viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written
    viper.SafeWriteConfigAs("/path/to/my/.other_config")
    

4. 监视和重读配置文件: Watching and re-reading config files

  • viper 支持在运行时实时读取配置文件的功能。不需要重启才能生效配置文件了!

    • 读取配置文件后执行viper.WatchConfig()就可以了, 还可以添加回调函数, 记录更改的文件等等。
    viper.OnConfigChange(func(e fsnotify.Event) {
    	fmt.Println("Config file changed:", e.Name)
    })
    viper.WatchConfig()
    
  • 实际例子展示:前面的 viper的设置,就是前文的一些设置

    r := gin.Default()
    	r.GET("/version", func(c *gin.Context){
    		c.JSON(http.StatusOK, gin.H{
    			"name": "haungdonglin",
    			"age": 18,
    			// 读取配置里的 version
    			"version": viper.Get("version").(string),
    		})
    	})
    	// 获取配置文件中的端口号
    	r.Run(":" + viper.Get("port").(string))
    
  • 设置的配置文件:
    在这里插入图片描述

  • 运行程序,成功启动 8080端口。输入:http://127.0.0.1:8080/version,得到结果:

    • {“age”:18,“name”:“haungdonglin”,“version”:“1.17.2”}
  • 还下面不停止服务器: 继续修改配置文件, 会提示我们修改的信息,回调函数。并且再次访问,会得到新的version值。

    • {“age”:18,“name”:“haungdonglin”,“version”:“1.17.8”}
      在这里插入图片描述

5. 从io.Reader 中读取配置:Reading Config from io.Reader

  • 官方介绍:除了这些提供给你的之外: such as files, environment variables, flags, and remote K/V store。 你还可以自定定义 所需要得配制源,然后提供给 viper。

    viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
    
    	// any approach to require this configuration into your program.
    	// 将配置转换为 字节类型的slice,再读取
    	var yamlExample = []byte(`
    	Hacker: true
    	name: steve
    	hobbies:
    	- skateboarding
    	- snowboarding
    	- go
    	clothing:
    	  jacket: leather
    	  trousers: denim
    	age: 35
    	eyes : brown
    	beard: true
    	`)
    
    	viper.ReadConfig(bytes.NewBuffer(yamlExample))
    
    	viper.Get("name") // this would be "steve"
    

6. 覆盖设置:

  • 前面最开始就讲过, 显示调用Set优先级最高,可用于覆盖配置。
  • 官方介绍是说: 这些可以来自命令行标志,也可以来自您自己的应用程序逻辑。(自己通过逻辑判断是否 设置,更改)
viper.Set("Verbose", true)
viper.Set("LogFile", LogFile)

7. 注册和使用别名: Registering and Using Aliases

  • 别名允许单个值被多个键引用。

    // 这里建立别名
    viper.RegisterAlias("loud", "Verbose")
    
    // 使用这俩名字的效果是相同的
    viper.Set("verbose", true) // same result as next line
    viper.Set("loud", true)   // same result as prior line
    
    viper.GetBool("loud") // true
    viper.GetBool("verbose") // true
    

8. 使用环境变量:Working with Environment Variables

  • 可以直接查看文档介绍: https://github.com/spf13/viper#working-with-environment-variables

    • AutomaticEnv():
      BindEnv(string…) : error:
      SetEnvPrefix(string): 使用前缀
      SetEnvKeyReplacer(string…) *strings.Replacer
      AllowEmptyEnv(bool)
  • 实例

    // 自动转换为大写
    SetEnvPrefix("spf") // will be uppercased automatically
    // 绑定键名
    BindEnv("id")
    // 默认的就为这个SPF_ID
    os.Setenv("SPF_ID", "13") // typically done outside of the app
    
    id := Get("id") // 13
    

9 。使用flags(命令行参数): Working with Flags

  • 没咋用过,可以看官方文档

    package main
    
    import (
    	"flag"
    	"github.com/spf13/pflag"
    )
    
    func main() {
    	// using standard library "flag" package
    	flag.Int("flagname", 1234, "help message for flagname")
    
    	pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
    	pflag.Parse()
    	viper.BindPFlags(pflag.CommandLine)
    
    	i := viper.GetInt("flagname") // retrieve value from viper
    
    	// ...
    }
    
  • 还要远程读取等内容,就不介绍了,没使用过。文档都要介绍和 例子。

11. 从viper 中获取值:Getting Values From Viper

  • 在Viper中,有几种方法可以根据值的类型获取值。存在以下函数和方法:
    • Get(key string) : interface{}
      GetBool(key string) : bool
      GetFloat64(key string) : float64
      GetInt(key string) : int
      GetIntSlice(key string) : []int
      GetString(key string) : string
      GetStringMap(key string) : map[string]interface{}
      GetStringMapString(key string) : map[string]string
      GetStringSlice(key string) : []string
      GetTime(key string) : time.Time
      GetDuration(key string) : time.Duration
      IsSet(key string) : bool
      AllSettings() : map[string]interface{}
    • 任何Get 方法在找不到值的时候,都会返回 0 值,为了检测键是否存在,提供了 IsSet()方法。
    • AllSettings() 获取所有得值。

12. 访问嵌套的键: Accessing nested keys

  • 下面例子展示的: json文件形式的嵌套配置文件。

    {
        "host": {
            "address": "localhost",
            "port": 5799
        },
        "datastore": {
            "metric": {
                "host": "127.0.0.1",
                "port": 3099
            },
            "warehouse": {
                "host": "198.0.0.1",
                "port": 2112
            }
        }
    }
    
    • 使用 点 . 分隔符,进行嵌套访问:GetString("datastore.metric.host") // (returns "127.0.0.1")

    • 还有下面的情况:

      {
          "datastore.metric.host": "0.0.0.0",
          "host": {
              "address": "localhost",
              "port": 5799
          },
          "datastore": {
              "metric": {
                  "host": "127.0.0.1",
                  "port": 3099
              },
              "warehouse": {
                  "host": "198.0.0.1",
                  "port": 2112
              }
          }
      }
      
      GetString("datastore.metric.host") // returns "0.0.0.0"
      优先 找 名字匹配的。 再找嵌套的。
      

13. 提取子树: Extracting a sub-tree

  • 在开发可重用模块时,提取配置的子集并将其传递给模块通常很有用。这样,可以使用不同的配置多次实例化模块。
    • 例如
cache:
  cache1:
    max-items: 100
    item-size: 64
  cache2:
    max-items: 200
    item-size: 80
cache1Config := viper.Sub("cache.cache1")
// cache1Config 就代表 cache1

并且还可以定义一个缓存函数,基于 这个,便于进行缓存。
cache1 := NewCache(cache1Config)

14. 反序列化: Unmarshaling

  • 您还可以选择将所有或特定值解组到结构、映射等。
  • 有两个函数可以选择:
    • Unmarshal(rawVal interface{}) : error
      UnmarshalKey(key string, rawVal interface{}) : error

    • 例子:将结构体的配置信息,解析

      type config struct {
      	Port int
      	Name string
      	PathMap string `mapstructure:"path_map"`
      }
      
      var C config
      
      err := viper.Unmarshal(&C)
      if err != nil {
      	t.Fatalf("unable to decode into struct, %v", err)
      }
      
    • 当解析的key 含有默认的分隔符 . 的时候,需要修改分隔符

      // 修改默认的分隔符
      v := viper.NewWithOptions(viper.KeyDelimiter("::"))
      
      v.SetDefault("chart::values", map[string]interface{}{
      	"ingress": map[string]interface{}{
      		"annotations": map[string]interface{}{
      			"traefik.frontend.rule.type":                 "PathPrefix",
      			"traefik.ingress.kubernetes.io/ssl-redirect": "true",
      		},
      	},
      })
      
      type config struct {
      	Chart struct{
      		Values map[string]interface{}
      	}
      }
      
      var C config
      
      v.Unmarshal(&C)
      
    • 还支持写入嵌套的结构体,要注意 viper 的tag

      • 这样就可以读出来上面的配置
      type MysqlConfig struct {
      		Host string `mapstructure:"port"`
      		DbName string `mapstructure:"dbname"`
      		Port int `mapstructure:"port"`
      	}
      
      	type Config struct {
      		Port int `mapstructure:"port"`
      		Version string `mapstructure:"version"`
      		MysqlConfig `mapstructure:"mysql"`
      	}
      
      	var c Config
      	_ = viper.Unmarshal(&c)
      	fmt.Printf("c: %#v\n", c)
      	
      	结果:c: main.Config{Port:8080, Version:"1.17.10", 	MysqlConfig:main.MysqlConfig{Host:"13306"
      , DbName:"sql_demo", Port:13306}}
      
  • 后买还有序列化为字符串, 使用多个 viper 实例(New)。就不细讲了,可以看文档。

viper读取配置文件

  • 有两种方式:
    • 第一种就是 上面的 viper.Get,等等方法。直接读取配置文件
    • 第二种就是使用 结构体来存储配置信息。 定义结构体类型的变量。 然后进行 viper.Unmarshal反序列化读取数据到结构体中, 避免了大量的 Get等操作。
Viper读写配置文件 Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。 阅读详情

相关推荐

[Golang] 实战小技巧-viper读取配置文件路径两种方式

在使用viper去寻找配置文件的时候,老是出错,之前已经遇到过了一次,没搞懂,所以我想总结一篇文章来记录这个问题。

Jing_Hua 1150

viper读取配置文件

Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。设置默认值从JSON、TOML、YAML、HCL、envfile和格式的配置文件读取配置信息实时监控和重新读取配置文件(可选)从环境变量中读取从远程配置系统(etcd或Consul)读取并监控配置变化从命令行参数读取配置从buffer读取配置显式配置值Viper能够帮助我们执行以下操作:查找、加载和反序列化JSON、TOML、YAML、HCL、INI、

chencong3139的博客 1972

【全】Go Web + viper 配置文件 使用指南

配置文件用于存储应用程序的各种配置选项。可以采用 JSON、YAML、TOML 等格式。Go 中的配置文件通常映射到结构体,以便于直接访问各个配置项。Viper 是一个功能强大的库,用于读取和管理 Go 应用程序的配置。利用 Viper 读取 YAML 格式的配置文件,并映射到 Go 结构体。单元测试确保配置读取逻辑的正确性。Viper 提供了监控配置文件变更并自动重新读取的功能。使用中间件记录 HTTP 请求日志,帮助调试和监控。通过配置文件管理数据库连接参数,集成 MySQL。

走向CTO的路上... 716

golang使用viper库读取配置文件

golang中用viper读取配置文件的方法

u012559967的专栏 989

从零到一:RagFlow源码架构深度解析与二次开发实战指南

本文深入解析RagFlow源码架构,提供从环境搭建到二次开发的全流程实战指南。作为企业级AI搜索框架,RagFlow通过模块化设计和多模态处理能力,支持自定义智能体开发与文搜文档功能,帮助开发者高效构建智能搜索系统。

w1x2y3的博客 266

Android 默认授予所有应用权限以及特殊权限处理

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:在PMS成功启动时并收到回掉systemReady回进行应用权限授予。DefaultPermissionGrantPolicy为权限处理策略管理类。这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。可通过此方法进行所有应用权限赋予:如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

Jimmy的专栏 1508

go语言web开发系列之四:gin框架用viper读取配置文件数据

一,安装viper 1,viper的代码地址: https://github.com/spf13/viper 查看viper版本: https://github.com/spf13/viper/releases 2,安装: root@ku:~# go get -u github.com/spf13/viper@v1.7.1 说明:刘宏缔的go森林是一个专注golang的博客, 地址:https://blog.youkuaiyun.com/weixin_43881017 说明:作者:...

刘老师的技术森林 3352

别再手动盘点了!教你给微信小程序仓库系统加个‘扫码枪’:完整扫码入库与查询功能实现

本文详细介绍了如何为微信小程序仓库系统添加扫码入库与查询功能,实现零硬件成本的智能仓储管理。通过优化摄像头参数、增强动态识别算法和深度整合业务逻辑,提升扫码精度和效率,同时提供混合查询方案应对复杂场景。这套方案显著提升入库效率,降低错误率,适用于各类仓储管理需求。

weixin_30844577的博客 298

【golang自学之路(三)】go-web快速开发脚手架搭建

golang做web开发搭建快速脚手架:1.采用gin框架+gorm框架负责resful+mysql2.缓存采用go-redis3.日志选择zap4.配置采用vipergolang web脚手架项目采用CLD分层理念Controller:服务的入口,负责处理路由、参数校验、请求转发。:逻辑(服务)层,负责处理业务逻辑。**DAO/Repository:**负责数据与存储相关功能。区别于java框架常用的MVC框架,CLD更好的杜绝了Model层在处理业务逻辑时的臃肿。

qq_42961251的博客 2674

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算

ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。

liarsup的博客 8260

IAR9.4报错之编码方式

IAR9.40编码方式错误导致的报错

qq_36081075的博客 2624

Golang的viper库

Golang的viper库

Harris-H的博客 782

在群辉(NAS)中安装虚拟机套件(Virtual Machine Manager)

一、在群辉中下载虚拟机套件Virtual Machine Manager ①启用Open vSwitch(网络-->管理--启用Open vSwitch) ②打开“套件中心” ③查找到Virtual Machine Manager套件点击“安装套件” 二、安装虚拟机套件(Virtual Machine Manager) ①打开虚拟机套件运行设置向导 ②选择存储空间...

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

Go语学习笔记 - 配置文件使用、日志配置 | Web框架Gin(二)

我还是想按照正常的项目结构调整一下,这篇笔记主要是三个部分:调整项目目录结构、增加配置文件使用、增加日志配置,很常规而且也是每个项目都需要用到的。

阿良的博客 3725

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1473

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 560

viper 读取 环境变量_Go 每日一库之 viper

Go 每日一库之 viper简介上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库。 viper 是一个配置解决方案,拥有丰富的特性:支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件;可以设置监听配置文件的修改,修改时自动加载新的配置;从环境变量、命令行选项和io.Reader中读取配置;从远程配置系统中...

weixin_39573287的博客 1471

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

go viper

go viper一 概述二 安装三 使用3.1 viper 数据获取3.1.1 从命令行参数获取数据3.1.2 从环境变量获取数据3.1.3 从配置文件获取数据3.1.4 从io.Reader中读取数据3.1.5 设置默认值3.2 viper 数据操作3.2.1 读取键值3.2.2 Unmarshal3.3 viper 数据保存3.4 其他3.4.1 监听文件修改 一 概述 Viper是Go应用程序的完整配置解决方案,它旨在在应用程序中工作,并可以处理所有类型的配置需求和格式。 它支持特性: 设置默认

XHW___001的博客 813

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

Go 每日一库之 viper

简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库。viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件; 可以设置监听配置文件的修改,修改时自动加载新的配置; 从环境变量、命令行选项和io.Reader中读取配置; 从远程配置系统中读取和监听修改,如...

darjun的博客 1713

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

go语言中十分简单的配置文件读取Viper

在项目文件包下创建global包,包下创建global.go文件,这个全局包的作用的是,以后在使用的时候直接用包点Config就可以拿到所有配置文件的属性。在项目文件包下创建commons,commons包下创建parse包,parse包下创建Config.go。在项目下面创建initilization包,包下创建init_viper.go文件。该文件下是定义中的配置结构体,以后有需要配置的文件的一级结构体就放在这里。在全局包下创建 application.yaml文件。

weixin_62360776的博客 506

GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

本来有今天是继续接着上一章写微服务的。但是这几天有朋友说,再写Web框架的时候,遇到一个问题,就是很多的中间件(redis,微信,mysql,mq)的配置信息写的太杂了,很不好管理。希望我能写一篇有管理配置文件的。所以这篇就放到今天写吧。微服务就放到下一篇来说吧。今天介绍的主角:Viper。

Cheer_RIO的博客 1882

go viper 配置管理

(译注:因为Viper支持从多种配置来源,例如磁盘上的配置文件>命令行标志位>环境变量>远程Key/Value存储>默认值,我们在查找一个配置的时候如果在当前配置源中没找到,就会继续从后续的配置源查找,直到找到为止。如果你希望在Get()调用中使用-或者其他什么符号,但是环境变量里使用_分隔符,那么这个功能是非常有用的。这里用一个demo演示如何在gin框架搭建的web项目中使用viper,使用viper加载配置文件中的信息,并在代码中直接使用viper.GetXXX()方法获取对应的配置值。

daemon365的博客 937

viper 读取 环境变量_Viper解析&加载配置

Viper解析&加载配置 1 Viper是什么 Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性: 设置默认值 从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据 可以监视配置文件的变动、重新读取配置文件 从环境变量中读取配置数据 从远端配置系统中读取数据,并监视它们(比如etcd、Consul) 从命...

weixin_39788960的博客 1518

go使用viper读取配置参数热加载

viper 热加载

qq_34252060的博客 2150

go实践四 使用viper加载服务器配置config.go

Viper 简介 Viper是国外大神 spf13 编写的开源配置解决方案,具有如下特性: 设置默认值 可以读取如下格式的配置文件:JSON、TOML、YAML、HCL 监控配置文件改动,并热加载配置文件 从环境变量读取配置 从远程配置中心读取配置(etcd/consul),并监控变动 从命令行 flag 读取配置 从缓存中读取配置 支持直接设置配置项的值 安装viper: ...

daily886的博客 4035

Golang:开发Web程序

本文是基于Golang Web开发框架Gin实现的二次开发(

asdurt的博客 527
上一篇: (1)go web开发之 zap日志库的使用及gin框架配置zap记录日志详细文档讲解分析
下一篇: (3)go web开发之 基于雪花算法生成用户ID与自增id,uuid对比
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值