热门标签 | 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.

扩展

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




实战


推荐阅读
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 目录在Go语言项目中使用Zap日志库介绍默认的GoLogger日志库实现GoLogger设置Logger使用LoggerLogger的运行GoLogger的优势和劣势优势劣势Ube ... [详细]
  • 20220811:以下go语言代码输出什么?A:panic;B:编译错误;C:json marshal 报错
    2022-08-11:以下go语言代码输出什么?A:panic;B:编译错误;C:jsonmarshal报错;D:null;E:nil。packagemainimport(enc ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用gin改写“SectionBuildingRESTfulAPIs”第三方包需要提前准备的包有:“gopkg.ingin-gonicgin.v1”“gopkg.inmgo.v2” ... [详细]
  • 认真一点学 Go:18. 并发
    收录于《Go基础系列》,作者:潇洒哥老苗。>>原文链接学到什么并发与并行的区别?什么是Goroutine?什么是通道?Goroutine如何通信?相关函数的使用?sel ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • 本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO ... [详细]
  • 看到平台银行对接方案写的demo确实还不错记个笔记互相学习学习packageapiimport(cryptotlsnetnethttpstringssynct ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • 小编给大家分享一下Golang端口复用测试的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • [Redis 系列]redis 学习六,redis 事务处理和监控事务
    【Redis系列】redis学习六,redis事务处理和监控事务写在前面我们学过的事务都是保证原子性的,但是redis的事务中执行多个指令,是不保证原子性的redis事务的本质就是 ... [详细]
  • 目标由于众所周知的原因,golang.org无法直接访问,golang文档和安装包无法下载,golang.orgxnet等官方包无法下载。常见解决方案是无脑挂代理,解决一切问题,但 ... [详细]
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社区 版权所有