Golang之服务配置自动初始化

栏目: Go · 发布时间: 5年前

内容简介:今天分享一个利用下面,我们就来利用磨刀不误砍柴工,我们先整理好一个简单思路,然后再尝试实现它,这样就简单了。

今天分享一个利用 reflect 在实际项目中比较省时、代码简洁且高效的方法-服务配置自动初始化的方法。 我们在起一个Web项目时,常常都是直接使用开源的一些框架或组建,然后在我们自己的项目中要使用之前按照该框架或组建提供的帮助文档一个一个进行相应的初始化配置。也许我们只引用其中一两个,这样写都还能忍受,可是如果这个服务会引用更多的呢?

Golang之服务配置自动初始化

效果

Golang之服务配置自动初始化
  1. 代码简洁化
  2. 接入第三方库就如搭积木一样,模块化,随取随用
  3. 可维护性高

干货

下面,我们就来利用 reflect 实现该功能。

思路

磨刀不误砍柴工,我们先整理好一个简单思路,然后再尝试实现它,这样就简单了。

  • 从远端配置服务或本地获取到我们需要初始化的配置
  • 解析配置中的数据
  • 判断配置中元素是否有实现我们指定方法,如果有就执行它,没有就跳过 没错,用语言描述就这么三句话,就这么简单。

获取配置

服务要启动,获取配置要么从远端配置服务拉取,要么从本地读取,就以常见的json格式作为我们本次举例的配置格式吧。

{
    "ginx": {
        "listen_port": 8080
    },
    "conn_timeout":2
}
复制代码

既然是json化的配置,那我们就需要一个 struct 结构体来对配置进行反解析,这个貌似没什么好说的。

type Cfg struct {
	ConnTimeout int        `json:"conn_timeout"`
	Ginx        *ginx.Ginx `json:"ginx"`
	// other config
}
复制代码

其中 ginx.Ginx 是我们自定义的一个结构体。

查找结构体中是否包含某方法

type ICanInit interface {
	Init()
}

func InitialRoot(rv reflect.Value) {
	tpe := rv.Type()
	for i := 0; i < tpe.NumField(); i++ {
		value := rv.Field(i)
		if conf, ok := value.Interface().(ICanInit); ok {
			conf.Init()
		}
	}
}
复制代码

对,上面的这个就是判断某结构体中是否已实现 Init() 方法,有的话就执行它。这个就是实现这个功能的核心,是不是很简单?哈哈。 我们在实现这个功能之前,只需要对配置结构体进行一下简单的类型判断就OK了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图论——一个迷人的世界

图论——一个迷人的世界

本杰明,查特兰,张萍 / 机械工业出版社 / 2001-1-1

本书介绍了图论的基本概念,解释了图论中各种经典问题。例如,熄灯的问题、小生成树问题、哥尼斯堡七桥问题、中国邮递员问题、国际象棋中马的遍历问题和路的着色问题等等。书中也给出了各种类型的图,例如,二部图、欧拉图、彼得森图和树;等等。每一章都为读者设置了练习题,包含了具有挑战性的探索性问题。一起来看看 《图论——一个迷人的世界》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具