go语言中的配置管理神器 --viper 二 实战

简介: go语言中的配置管理神器 --viper 二 实战

viper实战教程

本文将介绍一个基于viper读取配置文件的小demo。

下面是目录结构

创建配置文件

在config下的config.yaml文件下添加以下内容

Server:
  RunMode: debug
  HttpPort: :8080
  ReadTimeout: 60
  WriteTimeout: 60
App:
  DefaultPageSize: 10
  MaxPageSize: 100
  LogSavePath: storage/logs
  LogFileName: tools
  LogFileExt: .log
Database:
  DBType: mysql
  Username: root  # 填写你的数据库账号
  Password: root  # 填写你的数据库密码
  Host: 127.0.0.1:3306
  DBName: douyin
  TablePrefix: blog_
  Charset: utf8
  ParseTime: True
  MaxIdleConns: 10
  MaxOpenConns: 30

在global文件夹下添加setting.go文件,并添加以下内容

package global
import "studyviper/setting"
var (
   ServerSetting   *setting.ServerSettingS
   AppSetting      *setting.AppSettingS
   DatabaseSetting *setting.DatabaseSettingS
)

添加global文件时把几个类实例化为全局变量,方便将来其他需要的方法调用。

创建配置类

创建配置类的目的是把配置文件中的属性加载如实体类里面,方便其他程序进行读取配置信息的操作。

在setting文件夹下的section.go文件夹下添加下面的内容:

package setting
import "time"
type ServerSettingS struct {
   RunMode      string
   HttpPort     string
   ReadTimeout  time.Duration
   WriteTimeout time.Duration
}
type AppSettingS struct {
   DefaultPageSize int
   MaxPageSize     int
   LogSavePath     string
   LogFileName     string
   LogFileExt      string
}
type DatabaseSettingS struct {
   DBType       string
   UserName     string
   Password     string
   Host         string
   DBName       string
   TablePrefix  string
   Charset      string
   ParseTime    bool
   MaxIdleConns int
   MaxOpenConns int
}

添加配置规则

添加配置规则是为了让viper结构化的读取配置文件的信息,省略繁琐的手工步骤。

在setting文件夹下的setting.go文件下添加以下内容:

package setting
import "github.com/spf13/viper"
type Setting struct {
  vp *viper.Viper
}
// 实例化setting对象
func NewSetting() (*Setting, error) {
  vp := viper.New()          //创建viper对象
  vp.SetConfigName("config") //配置文件的名称
  vp.AddConfigPath("./config/")
  vp.SetConfigType("yaml") //配置文件的拓展名
  err := vp.ReadInConfig() //读取配置文件的内容
  if err != nil {
    return nil, err
  }
  return &Setting{vp}, nil
}
//可以选择 Unmarshaling 所有的值或特定得值到 struct,map 
func (s *Setting) ReadSection(k string, v interface{}) error {
  err := s.vp.UnmarshalKey(k, v)
  if err != nil {
    return err
  }
  return nil
}

测试启动类

编写main方法,查看程序是否按照期望进行输出。

在main.go文件添加以下内容

package main
import (
  "fmt"
  "studyviper/global"
  "studyviper/setting"
)
func main() {
  setting, err := setting.NewSetting()
  if err != nil {
    fmt.Println("初始化viper出错")
  }
  err = setting.ReadSection("Server", &global.ServerSetting)
  if err != nil {
    fmt.Println("读取Server配置出错")
  }
  fmt.Println(global.ServerSetting)
  err = setting.ReadSection("App", &global.AppSetting)
  if err != nil {
    fmt.Println("读取APP配置出错")
  }
  fmt.Println(global.AppSetting)
  err = setting.ReadSection("Database", &global.DatabaseSetting)
  if err != nil {
    fmt.Println("读取Database配置出错")
  }
  fmt.Println(global.DatabaseSetting)
}

正常的输出结果:


相关文章
|
1月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
144 0
|
1月前
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
179 0
|
3天前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
1月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
232 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
1月前
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
1月前
|
数据采集 Go API
Go语言实战案例:使用context控制协程取消
本文详解 Go 语言中 `context` 包的使用,通过实际案例演示如何利用 `context` 控制协程的生命周期,实现任务取消、超时控制及优雅退出,提升并发程序的稳定性与资源管理能力。
|
1月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
1月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
1月前
|
数据采集 编解码 监控
Go语言实战案例:使用channel实现生产者消费者模型
本文是「Go语言100个实战案例 · 网络与并发篇」第4篇,通过实战案例详解使用 Channel 实现生产者-消费者模型,涵盖并发控制、任务调度及Go语言并发哲学,助你掌握优雅的并发编程技巧。
|
1月前
|
数据采集 消息中间件 编解码
Go语言实战案例:使用 Goroutine 并发打印
本文通过简单案例讲解 Go 语言核心并发模型 Goroutine,涵盖协程启动、输出控制、主程序退出机制,并结合 sync.WaitGroup 实现并发任务同步,帮助理解 Go 并发设计思想与实际应用。