热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多种方式读取MySQL数据库配置

集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。思路文件读取获取字节流文件类型分析,确定解析api集成第三方解析api管理器定义






集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。



思路


  1. 文件读取获取字节流

  2. 文件类型分析,确定解析api

  3. 集成第三方解析api管理器

  4. 定义目标配置的结构体及约束性接口

  5. 实现解析器接口方法及其构造方法


结构

目录

$GOPATH\src
├─demo
│ ├─conf.json
│ ├─conf.yaml
│ ├─conf.xml
│ ├─main.go

conf.yaml

mysql:
default: {
host: 127.0.0.1:3306,
dbname: test,
username: root,
password: default
}
...

上码

package main
import (
"encoding/json"
"encoding/xml"
"errors"
"fmt"
"io/ioutil"
"path"
"path/filepath"
"gopkg.in/yaml.v2"
)
// DB 数据库配置
type DB struct {
Host string
Dbname string
Username string
Password string
}
// Config 配置
type Config struct {
Mysql map[string]DB
}
// Action 行为约束 导入/解析
type Action interface {
Type() string
Load(filename string) error
Resolve() (out interface{}, err error)
}
// Resolver 解析器
type Resolver struct {
filename string
conf *Config
in []byte
}
// Manager 管理器 集成三方解析api
var Manager = map[string]func([]byte, interface{}) error{
"yaml": yaml.Unmarshal,
"json": json.Unmarshal,
"xml": xml.Unmarshal,
}
// New 初始化实例
func New() *Resolver {
return &Resolver{conf: new(Config)}
}
// Name 文件名
func (r *Resolver) name() string {
return filepath.Base(r.filename)
}
// Type 类型
func (r *Resolver) Type() string {
return path.Ext(r.filename)[1:]
}
// Load 加载
func (r *Resolver) Load(filename string) (err error) {
raw, err := ioutil.ReadFile(filename)
if err != nil {
return fmt.Errorf("加载错误: %v ", err)
}
r.filename = filename
r.in = raw
return nil
}
// Resolve 解析
func (r *Resolver) Resolve() (out interface{}, err error) {
ext := r.Type()
if unmarshal, ok := Manager[ext]; ok {
err = unmarshal(r.in, r.conf)
}
if err != nil {
return nil, errors.New("解析错误")
}
out = *r.conf
return
}
func main() {
filename := "conf.json"
r := New() // 1. 加载
if err := r.Load(filename); err != nil {
fmt.Printf("%v\n", err)
return
}
data, err := r.Resolve() // 解析
if err != nil {
fmt.Printf("%v\n", err)
return
}
fmt.Printf("%s 解析%s:\n", r.Type(), r.name())
fmt.Println(data)
}

效果

$ go run main.go
json 解析conf.json:
{map[data_center:{127.0.0.1:3306 test root data_center} default:{127.0.0.1:3306 test root default} slave_db01:{127.0.0.1:3306 test root slave_db01} user_center:{127.0.0.1:3306 test root user_center}]}
$ go run main.go
加载错误: open ssconf.yaml: The system cannot find the file specified.

扩展

可扩展解析方法,加日志,加自定义解析,加命令行形式读取....




实战


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
author-avatar
霸气的萱---_299
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有