当前位置: 首页 > article >正文

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 的成员变量需要大写开头。


http://www.kler.cn/a/452270.html

相关文章:

  • Docker Compose 配置指南
  • RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗
  • 【Java基础-26.1】Java中的方法重载与方法重写:区别与使用场景
  • 教育行业 UI 设计基础篇:简洁直观的风格打造
  • 突发!GitLab将停止对中国区用户提供GitLab.com账号服务
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • DVWA靶场第三关 CSRF
  • 【jvm】内存泄漏与内存溢出的区别
  • [Python3] Sanic中间件
  • 你比AI更有价值吗?
  • 微信小程序-基于Vant Weapp UI 组件库的Area 省市区选择
  • ESLint (10)
  • 低空经济的地理信息支撑:构建安全、高效的飞行管理体系
  • CSS|15 CSS3结构伪类border-collapse伪元素
  • PHP 微信棋牌开发全解析:高级教程
  • 解决Ascend上vllm运行时出现urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]
  • redis和mysql的区别
  • 威尔克斯(Wilks)分布
  • 基于Pycharm与数据库的新闻管理系统(3)MongoDB
  • shell拓展知识
  • React State(状态)
  • Qt实现Android的图案密码(图形解锁)源码分享
  • 计算机的错误计算(一百九十一)
  • 信息抽取(NLP)是什么技术有哪些应用?
  • 大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
  • 《Web 搜索引擎优化》