Viper快速配置与上手

快速上手

命令行下安装 viper:go get github.com/spf13/viper


这是完成后的文件结构图:

config.yaml 配置主文件,可以使用任意后缀指定格式,这里以 yaml 做示范
viper-init.go 初始化 viper
main.go 入口

在这里插入图片描述


编写配置文件

首先我们简单的在配置文件内瞎写一些内容(注意冒号后面保留一个空格,这是 yaml 规范!)

代码清单 config.yaml

name: "tom"
password: 123456

viper 初始化文件配置

之后来到 viper 初始化文件内编写初始化内容

编写初始化方法 InitViper 之前务必指定一个结构体,它对应着我们配置文件内的所有属性
这方便我们后期通过结构体获取对应属性

配置文件读取其实路径默认为项目根目录!!!

代码清单:viper-init.go

package viper

import (
	"fmt"
	"github.com/spf13/viper"
	"log"
)

// 结构体,对应配置文件所有属性
type Config struct {
	// mapstructure表示配置文件内属性的名称
	// 而Name则是结构体中定义的名字!
	Name string `mapstructure:"name"`
	Password int `mapstructure:"password"`
}

// viper初始化代码,返回一个Config指针对象
func InitViper() *Config  {
	// 实例化空结构体
	cf := Config{}
	// 从指定路径读取配置文件
	viper.SetConfigFile("./src/viper/config.yaml")

	// 开始读配置文件,并处理错误情况
	err := viper.ReadInConfig()
	if err != nil{
		log.Fatal("找不到该文件!")
	}

	fmt.Println("成功初始化viper")

	// 返回地址
	return &cf
}

入口文件

最后直接在入口文件里面调用就好啦!

我这里随便写了最基础的 gin 环境,请注意 viper 初始化方法的执行位置必须在 service 层之前!
你不初始化怎么获取到配置文件然后拿来用呢,对吧?

代码清单 main.go

package main

import (
	"github.com/gin-gonic/gin"
	"godemo/src/viper"
)

func main() {
	router := gin.Default()

	// 切记初始化viper再调用!!!
	config := viper.InitViper()

	router.GET("/test", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"name":config.Name,
		})
	})

	err := router.Run(":10086")
	if err != nil {
		return
	}
}

另一种配置方式

该配置方式省去了编写结构体的冗余步骤,比较方便


文件结构

使用 config 文件夹下的 config_loader.go 读取配置文件 config.yaml

在这里插入图片描述


读配置文件

我们首先随便在配置文件内写一些配置

配置文件 config.yaml

port: 10001
desc: "hello viper"

然后编写我们初始化 viper 的代码(此操作会直接把配置文件和 viper 管理,之后在任意文件内都可以直接使用 viper 操纵配置,所以在这里我们不需要全局暴露 viper 对象)

config/config_loader.go 代码清单:

package config

import (
	"fmt"
	"github.com/spf13/viper"
)

func ConfigurationInit() {
	viper.SetConfigName("config")   // 设置配置名称
	viper.SetConfigType("yaml")     // 设置配置类型
	viper.AddConfigPath("./")       // 从哪里开始查找配置文件
	err := viper.ReadInConfig()     // 读配置文件

    // 错误处理
	if err != nil {
        // 如果读不出来,直接中断程序
		panic(fmt.Errorf("read config err=%s", err))
	} else {
        // 读到了,就输出其中的一段文字
		fmt.Println(viper.GetString("desc"))
	}
}

好啦!我们就已经把配置文件挂载到全局对象 viper 上面去了,是不是很简单?

最后一步,来到 main.go ,直接使用 viper 全局对象通过配置的 key 获取其 value 即可

func main() {
	router := gin.Default()

	config.ConfigurationInit()  // 初始化config

	fmt.Println(viper.GetString("desc")) // 获取配置文件指定key的value并打印出来

	router.Run(":10001")
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhillery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值