其他分享
首页 > 其他分享> > 从零开发区块链应用(一)--golang配置文件管理工具viper

从零开发区块链应用(一)--golang配置文件管理工具viper

作者:互联网

目录

参考文件:https://github.com/spf13/viper

一、viper简介

viper是一个go 开发工具,主要是用于处理各种格式的配置文件,简化程序配置的读取问题,所以viper 是一个配置解决方案,它拥有丰富的特性:

二、viper 的基本方法

2.1 安装

go get github.com/spf13/viper

2.2 读取配置文件

Viper需要最少知道在哪里查找配置文件的配置。Viper支持JSONTOMLYAMLHCLenvfileJava properties格式的配置文件。Viper可以搜索多个路径,但目前单个Viper实例只支持单个配置文件。Viper不默认任何配置搜索路径,将默认决策留给应用程序。

下面是一个如何使用Viper搜索和读取配置文件的示例。不需要任何特定的路径,但是至少应该提供一个配置文件预期出现的路径。

viper.SetConfigFile("./config.yaml") // 指定配置文件路径
viper.SetConfigName("config") //配置文件名称(无扩展名)
viper.SetConfigType("yaml") // 如果配置文件的名称中没有扩展名,则必须要配置此项
viper.AddConfigPath("/etc/appname/")   // 查找配置文件所在的路径
viper.AddConfigPath("$HOME/.appname")  // 多次调用以添加多个搜索路径
viper.AddConfigPath(".")               // 还可以在工作目录中查找配置
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理读取配置文件的错误
	panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

在加载配置文件出错时,你可以像下面这样处理找不到配置文件的特定情况:

if err := viper.ReadInConfig(); err != nil {
    if _, ok := err.(viper.ConfigFileNotFoundError); ok {
        // 配置文件未找到错误;如果需要可以忽略
    } else {
        // 配置文件被找到,但产生了另外的错误
    }
}

// 配置文件找到并成功解析

2.3 viper取值的函数

三、 viper使用举例

3.1 yaml配置文件

# 程序配置
console:
  name: "token"
  version: "v1.0"
  port: ":9100"

# 日志配置
log: "yaml/log.json"

node:
  bsc:
    url: "https://data-seed-prebsc-1-s1.binance.org:8545/"
    chainID: 97
  heco:
    url: "https://http-testnet.huobichain.com"
    chainID: 256

mysql:
  user: root
  password: "123456"
  host: 127.0.0.1
  port: 3306
  database: token

3.2 本地配置文件读取方式

package config

import (
	"github.com/token/pkg/go-logger"
	"github.com/spf13/viper"
)

var Conf *Config

// Initialize
func Initialize() {

	// 加载配置文件
	viper.SetConfigType("yaml")
	viper.SetConfigName("config")
	viper.AddConfigPath("./yaml/")
	if err := viper.ReadInConfig(); err != nil {
		logger.Fatal("ReadInConfig error:", err)
	}

	Conf = &Config{
		LogCfg: viper.GetString("log"),
		Console: &Console{
			Name:    viper.GetString("console.name"),
			Version: viper.GetString("console.version"),
			Port:    viper.GetString("console.port"),
		},
		Mysql: &Mysql{
			User:     viper.GetString("mysql.user"),
			Password: viper.GetString("mysql.password"),
			Host:     viper.GetString("mysql.host"),
			Port:     viper.GetString("mysql.port"),
			Database: viper.GetString("mysql.database"),
		},
		Node: &Node{
			BSC: &NodeUrl{
				Url:     viper.GetString("node.bsc.url"),
				ChainID: viper.GetInt64("node.bsc.chainID"),
			},
			HECO: &NodeUrl{
				Url:     viper.GetString("node.heco.url"),
				ChainID: viper.GetInt64("node.heco.chainID"),
			},
		},
	}

	// 初始化日志配置
	logger.SetLogger("./yaml/log.json")
	logger.Info("Successful configuration load")
}

3.3 将配置信息序列化为结构体对象

package config

// yaml配置结构体
type Config struct {
	LogCfg  string   `json:"log"`
	Console *Console `json:"console"`
	Mysql   *Mysql   `json:"mysql"`
	Node    *Node    `json:"node"`
}

// yaml配置结构体
type Console struct {
	Name    string `json:"name"`
	Version string `json:"version"`
	Port    string `json:"port"`
}

type Mysql struct {
	User     string `json:"user"`
	Password string `json:"password"`
	Host     string `json:"host"`
	Port     string `json:"port"`
	Database string `json:"database"`
}

type Node struct {
	BSC  *NodeUrl `json:"bsc"`
	HECO *NodeUrl `json:"heco"`
}

type NodeUrl struct {
	Url     string `json:"url"`
	ChainID int64  `json:"chainID"`
}

3.4 配置读取

标签:string,配置文件,--,golang,json,viper,key,读取
来源: https://www.cnblogs.com/jemooner/p/15820409.html