golang实现yaml配置文件的解析

原文地址:golang实现yaml配置文件的解析 -- 无敌牛

欢迎参观我的个人博客无敌牛 -- 技术/著作/典籍/分享等

代码

需要建立3个文件,目录结构如下:

配置文件 conf.yaml

复制代码
redis:  
  host: "127.0.0.1"
  port: 6379
  db: 11  
  pass: "aaaaaa" 

go模块文件 go.mod,用于管理项目的依赖关系和版本信息

复制代码
module readyaml

主程序 readyaml.go

复制代码
package main

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

// 配置文件
type Conf struct {
    Redis RedisConfig      `mapstructure:"redis"`
}

// redis配置数据
type RedisConfig struct{
    HOST    string    `mapstructure:"host"`
    PORT    int       `mapstructure:"port"`
    DB      int       `mapstructure:"db"`
    PASS    string    `mapstructure:"pass"`
}

func getConf() Conf{
    var cfg Conf 

    // 设置待读取配置文件的名字
    viper.SetConfigName("conf")
    // 设置待读取配置文件的格式
    viper.SetConfigType("yaml")
    // 添加配置文件的检索路径
    viper.AddConfigPath(".")

    // 读取数据
    if err := viper.ReadInConfig(); err != nil {
        fmt.Printf("ReadInConfig error : %s\n", err)
        return cfg
    }

    // 测试 1 : 直接获取数据
    fmt.Printf("Host %s\n", viper.GetString("redis.host"))
    fmt.Printf("PORT %d\n", viper.GetInt("redis.port"))
    fmt.Printf("DB %d\n", viper.GetInt("redis.db"))
    fmt.Printf("PASS %s\n", viper.GetString("redis.pass"))

    // 通过viper模块,反序列化成对象
    if err := viper.Unmarshal(&cfg); err != nil {
        fmt.Printf("Unmarshal error : %s\n", err)
        return cfg
    }

    return cfg 
}

var cfg Conf = getConf()

func main() {
    // 打印测试
    fmt.Printf("HOST %s, PORT %d, DB %d, PASS %s len(PASS) %d\n", cfg.Redis.HOST, cfg.Redis.PORT, cfg.Redis.DB, cfg.Redis.PASS, len(cfg.Redis.PASS) )
}

首先,需要整理和更新项目的依赖关系

go mod tidy

这个过程中,会下载缺失的模块。go.mod文件会进行更新,并且多出一个go.sum文件,用于记录项目依赖树中所有模块的特定版本内容的预期哈希值。

在这个过程中,如果无法联网,或者无法访问源,则会报错如下图。如果没有报错,则可以直接执行第二步。

可以使用国内go代理解决这个问题,此处用到GOPROXY环境变量。

执行 export GOPROXY=https://goproxy.cn,然后继续执行 go mod tidy

也可以在 /etc/bashrc或者~/.bashrc文件添加这个命令,这样每次登录会话会自动添加此环境变量。

第二步,直接执行脚本: go run readyaml.go ;

也可以编译后再执行二进制文件: go build readyaml.go,编译后,创建了编译后的文件 readyaml。

直接执行 ./readyaml。具体操作,如下图所示:

避坑:定义的数据结构成员变量必须是大写字母开头,不然 viper.Unmarshal 这一步可能映射不成功。这是由于在golang中,以小写字母开头定义的标识符(如变量名、函数名、类型名等)只能在本包内访问,是不能跨包访问的

也就是:type RedisConfig struct 和 type Conf struct 的成员变量需要大写开头。

相关推荐
Ekreke1 小时前
Linux下网络管理常用工具
后端
洛卡卡了1 小时前
Go + Gin 优化动态定时任务系统:互斥控制、异常捕获与任务热更新
后端·go
hello早上好1 小时前
3-Zookeeper基础应用和实战
后端·架构
FreeLikeTheWind.1 小时前
Qt 开发时可以在函数内引用的头文件
开发语言·c++·qt
学会870上岸华师1 小时前
c语言学习16——内存函数
c语言·开发语言·学习
惜鸟1 小时前
Elasticsearch文档标签检索方案设计
后端·elasticsearch
喵手1 小时前
开启多个线程,如果保证顺序执行,你知道有哪几种方式实现?
java·后端·java ee
斜月1 小时前
springboot3与mybatisplus3.5.5 升级实践
spring boot·后端
wordbaby1 小时前
HTTP 状态码 503 Service Unavailable (服务不可用)
后端
InsightFuture1 小时前
《Java内存图原理》零废话图解Java对象内存分配:从代码到内存的深度拆解
后端