我们知道在程序启动时会需要执行一些"初始化"的逻辑操作,例如:Server
配置、各种数据库(MySQL
、Redis
、Kafka
等)配置、业务对象配置等等。绝大多数场景下,我们有两种初始化方式:隐式初始化和显式初始化。
一、隐式初始化
隐式初始化一般通过包初始化方法init
执行初始化。需要注意的是,如果初始化逻辑存在错误的可能,由于init
方法的错误无法被上层捕获,初始化出错时往往直接终止程序启动。例如:

隐式初始化出错时往往直接终止程序启动
隐式初始化的好处是不需要手动调用初始化方法,对于开发者隐藏了初始化细节,因此开发者没有心智负担。但是缺点也同样如此,开发者不知道初始化细节,一旦出现错误时,很难快速定位错误原因。因此使用隐式初始化时,往往要求在初始化出错时将详细的错误以及堆栈信息打印出来便于错误定位。
GoFrame
框架的很多模块都采用了隐式初始化,隐藏模块的初始化细节,减少开发者的心智负担。例如:

GoFrame
中的模块普遍存在隐式初始化设计

使用GoFrame
框架的main
包隐式imports
二、显式初始化
显式初始化要求开发在程序启动时,如在main
或者boot
模块中,调用特定的方法来执行初始化操作。一般来说,例如:
在boot
包中按照顺序执行显式初始化
在main
包调用boot.Boot()
方法执行初始化
三、如何选择
在业务场景下,非特殊必要,我们建议大家采用显式初始化的方式,以保证更好的可维护性。
6 Comments
manong
good~
jackwu
Nice~
sanrentai
又学了一招,之前都是在main函数里实现的。看起来乱七八的。这样组织代码以后,好看多了
jelly_lyj
boot_mongo.go, boot_redis.go 这几个boot有开源不
Abyscri Evagarden
数据库访问客户端初始化之类的没有依赖其他模块,并且通常被多个业务共用,似乎应该是基础模块?为什么这里都设置为显式初始化呢
Fed
显式初始化:开发者自定义顺序的初始化。
隐式初始化:约定俗成内置逻辑的初始化。