欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于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.為每個資源創(chuàng)建一個 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 方法

通過這種方式,就可以實現自動裝配了,有多少資源,就創(chuàng)建多少 config.go 文件,并實現 Starter 接口

到此這篇關于基于Golang實現統一加載資源的入口的文章就介紹到這了,更多相關Golang統一入口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang實現請求限流的幾種辦法(小結)

    Golang實現請求限流的幾種辦法(小結)

    這篇文章主要介紹了Golang實現請求限流的幾種辦法(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Go語言學習網絡編程與Http教程示例

    Go語言學習網絡編程與Http教程示例

    這篇文章主要為大家介紹了Go語言學習網絡編程與Http教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Go語言設計實現在任務欄里提醒你喝水的兔子

    Go語言設計實現在任務欄里提醒你喝水的兔子

    這篇文章主要為大家介紹了Go語言設計實現在任務欄里提醒你喝水的兔子示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 如何用go-zero 實現中臺系統

    如何用go-zero 實現中臺系統

    這篇文章主要介紹了如何用go-zero 實現中臺系統,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Go語言常見錯誤之any沒傳遞任何信息解決分析

    Go語言常見錯誤之any沒傳遞任何信息解決分析

    Go語言,由于其高效強大的并行處理能力和優(yōu)雅簡單的設計哲學,一直以來都是編程世界的寵兒,然而,對于一些Go新手和甚至熟悉Go的程序員也可能會遇到一個常見的錯誤:?any沒傳遞任何信息,那么,如何規(guī)避這個錯誤,本文將揭示其中的秘密
    2024-01-01
  • Golang中類型轉換利器cast庫的用法詳解

    Golang中類型轉換利器cast庫的用法詳解

    cast庫是一個簡潔而強大的第三方庫,它的主要功能是實現類型之間的安全轉換,而在Golang開發(fā)中,類型轉換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應用吧
    2024-11-11
  • Go語言實現棧與隊列基本操作學家

    Go語言實現棧與隊列基本操作學家

    go語言中,并沒有棧與隊列相關的數據結構,但是我們可以借助切片來實現棧與隊列的操作;接下來我們一起實現棧與隊列基本操作,感興趣的可以了解一下
    2022-11-11
  • golang簡單獲取上傳文件大小的實現代碼

    golang簡單獲取上傳文件大小的實現代碼

    這篇文章主要介紹了golang簡單獲取上傳文件大小的方法,涉及Go語言文件傳輸及文件屬性操作的相關技巧,需要的朋友可以參考下
    2016-07-07
  • golang中的三個點 ''...''的用法示例詳解

    golang中的三個點 ''...''的用法示例詳解

    這篇文章主要介紹了golang中的三個點 '...' 的用法示例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Go 驗證字符串中是否包含中文(推薦)

    Go 驗證字符串中是否包含中文(推薦)

    這篇文章主要介紹了Go 驗證字符串中是否包含中文,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01

最新評論