首页 > 其他分享 >一个小例子,给你讲透 Go 配置管理,轻松将其融入到项目中

一个小例子,给你讲透 Go 配置管理,轻松将其融入到项目中

时间:2024-09-14 12:24:43浏览次数:13  
标签:融入 Username 配置文件 fmt 配置管理 toml viper Go Password


在软件开发中,配置管理是一个不可或缺的部分。无论是开发环境、测试环境还是生产环境,我们都需要一种方法来存储和读取配置信息。

在 Golang 项目中,Viper 是一个非常流行且功能强大的库,用于处理配置文件。下面我会写一些例子,帮助大家快速上手。

什么是 Viper?

不卖关子,直接上 GitHub 地址:https://github.com/spf13/viper 大家可以直接去看 README.md

我简单的描述下,Viper 是一个 Go 语言的配置管理库,它提供了简单而强大的方式来处理应用程序的配置需求。无论是从文件、环境变量还是远程配置中获取配置信息,Viper 都能搞定。

如何使用 Viper?

安装

在终端中运行以下命令:

go get github.com/spf13/viper

基本用法

以下是一个简单的示例,展示如何读取配置文件:

package main

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

func main() {
 // 设置配置文件名称(不包括文件扩展名)
 viper.SetConfigName("config")

 // 设置配置文件类型
 viper.SetConfigType("toml")

 // 添加配置文件搜索路径
 viper.AddConfigPath(".")

 // 读取配置文件
 err := viper.ReadInConfig()
 if err != nil {
  panic(fmt.Errorf("fatal error config file: %w", err))
 }

 // 获取配置项
 message := viper.GetString("message")
 fmt.Println("Message:", message)
}

配置文件示例(config.toml)

message = "Hello, Viper!"

输出

Message: Hello, Viper!

这只是一个基本的用法,但在实际项目开发中,推荐采用绑定到配置结构体的方法。

业务场景

场景一

例如,在涉及 MySQL 和 Redis 的项目中,可能需要在配置文件中设置用户名和密码。这时,采用结构体绑定配置的方法比较清晰,可以参考如下示例。

package main

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

type configStructs struct {
 MySQL struct {
  Username string `toml:"username"`
  Password string `toml:"password"`
 } `toml:"mysql"`

 Redis struct {
  Username string `toml:"username"`
  Password string `toml:"password"`
 } `toml:"redis"`
}

func main() {
 // 设置配置文件名称(不包括文件扩展名)
 viper.SetConfigName("config")

 // 设置配置文件类型
 viper.SetConfigType("toml")

 // 添加配置文件搜索路径
 viper.AddConfigPath(".")

 // 读取配置文件
 err := viper.ReadInConfig()
 if err != nil {
  log.Fatal(fmt.Errorf("fatal error config file: %w", err))
 }

 // 将配置文件解析到结构体
 configs := new(configStructs)
 err = viper.Unmarshal(configs)
 if err != nil {
  log.Fatal(fmt.Errorf("fatal error config file: %w", err))
 }

 fmt.Println("MySQL-Username:", configs.MySQL.Username)
 fmt.Println("MySQL-Password:", configs.MySQL.Password)
 fmt.Println("Redis-Username:", configs.Redis.Username)
 fmt.Println("Redis-Password:", configs.Redis.Password)
}

配置文件示例(config.toml)

[mysql]
    username = "mysql"
    password = "mysql_qwerty"

[redis]
    username = "redis"
    password = "redis_qwerty"

输出:

MySQL-Username: mysql
MySQL-Password: mysql_qwerty
Redis-Username: redis
Redis-Password: redis_qwerty

场景二

例如,目标是发布一个包含所有必需配置的独立二进制包,而不将配置文件暴露在项目顶层目录。我们应该如何将配置文件嵌入到二进制文件中,确保它们在运行时可以被正确访问?

改造起来不麻烦,可参考如下示例。

package main

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

type configStructs struct {
 MySQL struct {
  Username string `toml:"username"`
  Password string `toml:"password"`
 } `toml:"mysql"`

 Redis struct {
  Username string `toml:"username"`
  Password string `toml:"password"`
 } `toml:"redis"`
}

var (
 //go:embed config.toml
 configFile []byte
)

func main() {
 // 设置配置文件名称(不包括文件扩展名)
 viper.SetConfigName("config")

 // 设置配置文件类型
 viper.SetConfigType("toml")

 // 添加配置文件搜索路径
 viper.AddConfigPath(".")

 // 读取配置文件
 err := viper.ReadConfig(bytes.NewReader(configFile))
 if err != nil {
  log.Fatal(fmt.Errorf("fatal error config file: %w", err))
 }

 // 将配置文件解析到结构体
 configs := new(configStructs)
 err = viper.Unmarshal(configs)
 if err != nil {
  log.Fatal(fmt.Errorf("fatal error config file: %w", err))
 }

 fmt.Println("MySQL-Username:", configs.MySQL.Username)
 fmt.Println("MySQL-Password:", configs.MySQL.Password)
 fmt.Println("Redis-Username:", configs.Redis.Username)
 fmt.Println("Redis-Password:", configs.Redis.Password)
}

输出:

MySQL-Username: mysql
MySQL-Password: mysql_qwerty
Redis-Username: redis
Redis-Password: redis_qwerty

代码封装

目前,示例代码都是直接在 main 函数中编写的。

为了提高代码的可维护性和可重用性,我们将这些配置相关的代码封装成一个独立的 configs 包。

package configs

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

// ConfigStructs 定义了配置文件的结构
type ConfigStructs struct {
 MySQL struct {
  Username string `toml:"username"`
  Password string `toml:"password"`
 } `toml:"mysql"`

 Redis struct {
  Username string `toml:"username"`
  Password string `toml:"password"`
 } `toml:"redis"`
}

var (
 // 配置结构体的实例
 config = new(ConfigStructs)

 //go:embed config.toml
 configFile []byte
)

func init() {
 // 设置配置文件名称(不包括文件扩展名)
 viper.SetConfigName("config")

 // 设置配置文件类型
 viper.SetConfigType("toml")

 // 添加配置文件搜索路径
 viper.AddConfigPath(".")

 // 读取配置文件
 err := viper.ReadConfig(bytes.NewReader(configFile))
 if err != nil {
  log.Fatal(fmt.Errorf("fatal error config file: %w", err))
 }

 // 将配置文件解析到结构体
 err = viper.Unmarshal(config)
 if err != nil {
  log.Fatal(fmt.Errorf("fatal error config file: %w", err))
 }
}

// Get 获取配置项
func Get() ConfigStructs {
 return *config
}

使用 configs 包:

import (
 "项目名称/pkg/configs"
 "fmt"
)

// 获取配置
fmt.Println("MySQL-Username:", configs.Get().MySQL.Username)
fmt.Println("MySQL-Password:", configs.Get().MySQL.Password)
fmt.Println("Redis-Username:", configs.Get().Redis.Username)
fmt.Println("Redis-Password:", configs.Get().Redis.Password)

输出:

MySQL-Username: mysql
MySQL-Password: mysql_qwerty
Redis-Username: redis
Redis-Password: redis_qwerty

到这,相信已经对 Viper 有了全面的了解,并能够在自己的 Go 项目中灵活应用

标签:融入,Username,配置文件,fmt,配置管理,toml,viper,Go,Password
From: https://blog.51cto.com/u_15183360/12015797

相关文章

  • Golang并发编程中匿名函数的应用与性能考量
    在Golang并发编程中,匿名函数是一种常见且非常实用的编程工具。匿名函数是指没有名称的函数,可以在函数内部定义和使用,或者作为参数传递给其他函数。这种方式不仅简化了代码结构,还能增强代码的灵活性,尤其在并发编程中,匿名函数的使用更能展现其优势。不过,如何合理使用匿名函数并在实......
  • 1小时快速了解Go语言(写给打算转职golang的程序员)
    本文章也有对应的视频讲解:1小时快速了解Go语言开发环境搭建Go语言下载地址:https://go.dev/dl,Windows、Mac、Linux都支持,Windows和Mac下载后直接双击安装即可,Linux下载后解压到任意目录都可以,Linux需要手动设置环境变量GOROOT/GOPATH/PATH。IDE使用Vscode即可,下载地址:https:......
  • Golang中命名参数的高级使用技巧与实例分析
    Golang是一门以简洁、高效著称的编程语言,因其强大的并发处理能力和灵活的语法设计,被广泛应用于各种开发场景。在Golang中,参数传递是日常编程中不可或缺的部分,而命名参数的使用则能够提升代码的可读性和维护性。本文将探讨Golang中命名参数的高级使用技巧,并通过实例进行分析,帮助开......
  • GO语言初步详细介绍以及环境变量的配置----保姆级教程
    一:概述Go语言(也称为Golang)是一种由Google公司设计和开发的静态类型、编译型编程语言。自2009年正式对外发布以来,Go语言以其简洁、高效和强大的并发处理能力迅速赢得了开发者的青睐,并在多个领域得到广泛应用。二:具体说明<1>Go语言的详细介绍1.1Go语言的特点简洁、易读和易写:Go语言......
  • Django的IT人才招聘网站管理系统的设计与实现-附源码03763
    摘   要随着信息技术行业的迅速发展,企业对于高素质的IT人才的需求日益增长。为了满足企业招聘需求和提供更好的求职体验,开发一个高效、可靠的招聘网站管理系统变得尤为重要。论文将首先介绍Django框架的特点和优势,包括其灵活性、可扩展性和安全性等方面。然后,我们将详细......
  • 单例模式 Go
    单例模式单例模式的基本概念单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。它是一种常用的模式,可以在多种编程语言中实现。以下是单例模式的一些关键特点和理论概念:关键特性单一实例:确保只创建一个实例。全局访问:提供一个全局访问点......
  • 为何视频监控AI分析逐渐融入摄像头?浅述背后的必然逻辑
    视频监控的应用领域极为广泛,它已成为现代社会中各行各业不可或缺的信息化基石。从工业生产到日常生活,视频监控无处不在,其重要性不言而喻。传统上,视频监控仅局限于通过摄像头捕捉并储存图像,以此辅助我们的工作与生活。然而,随着人工智能技术的蓬勃发展,人们开始追求更高层次的视频监......
  • 解决Go程序可执行文件在alpine容器中无法运行
    Go可执行程序在alpine容器中无法运行的问题解决今天遇到一个问题,我把我的go应用编译好之后,在Dockerfile里指定它到容器中启动,但是启动不起来,我通过测试,发现了这个现象:我的程序是在容器里的,但是我要运行时,它缺提示notfound原因notfound不是说找不到这个程序,而是找不到需要的......
  • 如何学习go语言
    学习Go语言是一个系统而逐步深入的过程,以下是一些关键步骤和建议,帮助你高效地学习Go语言:书在python33点(0M一、了解Go语言的基础知识学习语法和基本概念:阅读官方的Go语言文档,包括语言规范、标准库和示例代码,了解Go语言的基本特性和用法。Go语言拥有简洁的语法结构和高效......
  • 创建一个Django项目
    步骤1:创建Django项目和应用创建Django项目:bashdjango-adminstartprojectmyprojectcdmyproject创建Django应用:bashpythonmanage.pystartappmyapp安装并配置DjangoRestFramework(如果尚未安装):bashpipinstalldjangorestframework将myapp和rest_f......