基于Golang实现统一加载资源的入口

 更新时间:2023年05月29日 09:06:30   作者:uccs  
当我们需要在 main 函数中做一些初始化的工作,比如初始化日志,初始化配置文件,都需要统一初始化入口函数,所以本文就来编写一个统一加载资源的入口吧

项目地址:https://github.com/astak16/go-starter

统一初始化入口

什么时候需要统一初始化入口函数呢?

当我们需要在 main 函数中做一些初始化的工作,比如初始化日志,初始化配置文件,初始化数据库等等

这些都是需要在 main 函数中做的初始化工作,这个时候就可以使用统一初始化入口的方式来实现

抽象出生命周期接口

使用统一初始化入口的方式,需要我们抽象出生命周期接口
比如下面我们定义了 Init、Setup、Start、StartBlocking、Stop 五个接口,用来完成五件事情:

  • Init: 系统启动,初始化一些基础资源,比如数据库,消息队列等
  • Setup: 安装一些基础资源,比如初始化数据库表,或者其他基础资源的初始化
  • Start: 启动基础资源,比如启动数据库连接池,消息队列消费者
  • StartBlocking: 启动器是否可阻塞,比如启动 RPC 服务,启动器需要一直阻塞才能提供 RPC 服务
  • Stop: 系统停止,一般是一些基础资源的回收和停止,比如数据库连接池,消息队列连接池等
type Starter interface {
    Init(ctx StarterContext)
    Setup(ctx StarterContext)
    Start(ctx StarterContext)
    StartBlocking() bool
    Stop(ctx StarterContext)
}

实现生命周期接口

下一步是实现这个接口,在 go 中 interface 是隐式实现的,只要实现了接口中的方法,就是实现了这个接口

type BaseStarter struct{}

func (b *BaseStarter) Init(ctx StarterContext)  {}
func (b *BaseStarter) Setup(ctx StarterContext) {}
func (b *BaseStarter) Start(ctx StarterContext) {}
func (b *BaseStarter) StartBlocking() bool      { return false }
func (b *BaseStarter) Stop(ctx StarterContext)  {}

实现自动装配

所有的启动器都实现了 Starter 接口

这时就可以将所有的启动器都放在一个切片中,然后遍历切片,依次调用 Init、Setup、Start、StartBlocking、Stop 方法

type StarterRegister struct {
    starters []Starter
}
func (sr *StarterRegister) Register(s Starter) {
    sr.starters = append(sr.starters, s)
}
func (sr *StarterRegister) AllStarters() []Starter {
    return sr.starters
}

提供一个注册和运行的方法,这样就可以实现自动装配了

func Register(s Starter) {
    starterRegister.Register(s)
}
func SystemRun() {
    ctx := StarterContext{}
    for _, s := range starterRegister.AllStarters() {
        s.Init(ctx)
        s.Setup(ctx)
        s.Start(ctx)
        s.StartBlocking()
        s.Stop(ctx)
    }
}

使用

1.为每个资源创建一个 config.go 文件,然后在 init 函数中注册

func init() {
	fmt.Println("config")
	Register(&Config{})
}

type Config struct{}

func (c *Config) Init(ctx StarterContext) {
	fmt.Println("Init")
}

func (c *Config) Setup(ctx StarterContext) {
	fmt.Println("Setup")
}

func (c *Config) Start(ctx StarterContext) {
	fmt.Println("Start")
}

func (c *Config) StartBlocking() bool {
  fmt.Println("StartBlocking")
	return true
}

func (c *Config) Stop(ctx StarterContext) {
	fmt.Println("Stop")
}

2.在 main 函数中调用 SystemRun 方法

通过这种方式,就可以实现自动装配了,有多少资源,就创建多少 config.go 文件,并实现 Starter 接口

到此这篇关于基于Golang实现统一加载资源的入口的文章就介绍到这了,更多相关Golang统一入口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言WaitGroup使用时需要注意的坑

    Go语言WaitGroup使用时需要注意的坑

    Go语言中WaitGroup的用途是它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。之前一直使用也没有问题,但最近通过同事的一段代码引起了关于WaitGroup的注意,下面这篇文章就介绍了WaitGroup使用时需要注意的坑及填坑。
    2016-12-12
  • Go语言操作数据库及其常规操作的示例代码

    Go语言操作数据库及其常规操作的示例代码

    这篇文章主要介绍了Go语言操作数据库及其常规操作的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • golang语言实现的文件上传与文件下载功能示例

    golang语言实现的文件上传与文件下载功能示例

    这篇文章主要介绍了golang语言实现的文件上传与文件下载功能,结合实例形式分析了Go语言实现的文件传输相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • 使用go实现简易比特币区块链公链功能

    使用go实现简易比特币区块链公链功能

    这篇文章主要介绍了使用go实现简易比特币区块链公链功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • go语言题解LeetCode1122数组的相对排序

    go语言题解LeetCode1122数组的相对排序

    这篇文章主要为大家介绍了go语言题解LeetCode1122数组的相对排序,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Golang Printf,Sprintf,Fprintf 格式化详解

    Golang Printf,Sprintf,Fprintf 格式化详解

    这篇文章主要介绍了Golang Printf,Sprintf,Fprintf 格式化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Go实现替换(覆盖)文件某一行内容的示例代码

    Go实现替换(覆盖)文件某一行内容的示例代码

    本文主要介绍了Go实现替换(覆盖)文件某一行内容的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go应用中优雅处理Error的技巧总结

    Go应用中优雅处理Error的技巧总结

    在程序员中,尤其是go新手,经常听到的一个讨论话题是:如何处理错误,这篇文章主要给大家介绍了关于Go应用中优雅处理Error的一些相关技巧,需要的朋友可以参考下
    2021-09-09
  • 关于升级go1.18的goland问题详解

    关于升级go1.18的goland问题详解

    作为一个go语言程序员,觉得自己有义务为go新手开一条更简单便捷的上手之路,下面这篇文章主要给大家介绍了关于升级go1.18的goland问题的相关资料,需要的朋友可以参考下
    2022-11-11
  • Go语言中的逃逸分析究竟是什么?

    Go语言中的逃逸分析究竟是什么?

    这篇文章主要介绍了Go语言中的逃逸,套哟究竟是什么呢?通俗来讲,当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了“逃逸”。下面文章将详细介绍Go语言中的逃逸,需要的朋友可以参考一下
    2021-09-09

最新评论