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了。


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

查看所有标签

猜你喜欢:

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

光线跟踪算法技术

光线跟踪算法技术

萨芬 / 刘天慧 / 清华大学出版社 / 2011-3 / 98.00元

《光线跟踪算法技术》详细阐述了与光线跟踪问题相关的高效解决方案及相应的数据结构和算法,主要包括采样技术、投影视图、视见系统、景深、非线性投影、立体视觉、光照与材质、镜面反射、光泽反射、全局光照、透明度、阴影、环境遮挡、区域光照、光线与对象间的相交计算、对象变换、栅格技术以及纹理映射技术等内容。此外,《光线跟踪算法技术》还提供了相应的算法、代码以及伪代码,以帮助读者进一步理解计算方案的实现过程。 ......一起来看看 《光线跟踪算法技术》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

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

在线 XML 格式化压缩工具