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

基于Golang實(shí)現(xiàn)統(tǒng)一加載資源的入口

 更新時(shí)間:2023年05月29日 09:06:30   作者:uccs  
當(dāng)我們需要在?main?函數(shù)中做一些初始化的工作,比如初始化日志,初始化配置文件,都需要統(tǒng)一初始化入口函數(shù),所以本文就來(lái)編寫一個(gè)統(tǒng)一加載資源的入口吧

項(xiàng)目地址:https://github.com/astak16/go-starter

統(tǒng)一初始化入口

什么時(shí)候需要統(tǒng)一初始化入口函數(shù)呢?

當(dāng)我們需要在 main 函數(shù)中做一些初始化的工作,比如初始化日志,初始化配置文件,初始化數(shù)據(jù)庫(kù)等等

這些都是需要在 main 函數(shù)中做的初始化工作,這個(gè)時(shí)候就可以使用統(tǒng)一初始化入口的方式來(lái)實(shí)現(xiàn)

抽象出生命周期接口

使用統(tǒng)一初始化入口的方式,需要我們抽象出生命周期接口
比如下面我們定義了 Init、Setup、Start、StartBlocking、Stop 五個(gè)接口,用來(lái)完成五件事情:

  • Init: 系統(tǒng)啟動(dòng),初始化一些基礎(chǔ)資源,比如數(shù)據(jù)庫(kù),消息隊(duì)列等
  • Setup: 安裝一些基礎(chǔ)資源,比如初始化數(shù)據(jù)庫(kù)表,或者其他基礎(chǔ)資源的初始化
  • Start: 啟動(dòng)基礎(chǔ)資源,比如啟動(dòng)數(shù)據(jù)庫(kù)連接池,消息隊(duì)列消費(fèi)者
  • StartBlocking: 啟動(dòng)器是否可阻塞,比如啟動(dòng) RPC 服務(wù),啟動(dòng)器需要一直阻塞才能提供 RPC 服務(wù)
  • Stop: 系統(tǒng)停止,一般是一些基礎(chǔ)資源的回收和停止,比如數(shù)據(jù)庫(kù)連接池,消息隊(duì)列連接池等
type Starter interface {
    Init(ctx StarterContext)
    Setup(ctx StarterContext)
    Start(ctx StarterContext)
    StartBlocking() bool
    Stop(ctx StarterContext)
}

實(shí)現(xiàn)生命周期接口

下一步是實(shí)現(xiàn)這個(gè)接口,在 go 中 interface 是隱式實(shí)現(xiàn)的,只要實(shí)現(xiàn)了接口中的方法,就是實(shí)現(xiàn)了這個(gè)接口

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)  {}

實(shí)現(xiàn)自動(dòng)裝配

所有的啟動(dòng)器都實(shí)現(xiàn)了 Starter 接口

這時(shí)就可以將所有的啟動(dòng)器都放在一個(gè)切片中,然后遍歷切片,依次調(diào)用 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
}

提供一個(gè)注冊(cè)和運(yùn)行的方法,這樣就可以實(shí)現(xiàn)自動(dòng)裝配了

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.為每個(gè)資源創(chuàng)建一個(gè) config.go 文件,然后在 init 函數(shù)中注冊(cè)

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 函數(shù)中調(diào)用 SystemRun 方法

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

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

相關(guān)文章

  • Golang實(shí)現(xiàn)請(qǐng)求限流的幾種辦法(小結(jié))

    Golang實(shí)現(xiàn)請(qǐng)求限流的幾種辦法(小結(jié))

    這篇文章主要介紹了Golang實(shí)現(xiàn)請(qǐng)求限流的幾種辦法(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Go語(yǔ)言學(xué)習(xí)網(wǎng)絡(luò)編程與Http教程示例

    Go語(yǔ)言學(xué)習(xí)網(wǎng)絡(luò)編程與Http教程示例

    這篇文章主要為大家介紹了Go語(yǔ)言學(xué)習(xí)網(wǎng)絡(luò)編程與Http教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Go語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)在任務(wù)欄里提醒你喝水的兔子

    Go語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)在任務(wù)欄里提醒你喝水的兔子

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

    如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng)

    這篇文章主要介紹了如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Go語(yǔ)言常見錯(cuò)誤之a(chǎn)ny沒傳遞任何信息解決分析

    Go語(yǔ)言常見錯(cuò)誤之a(chǎn)ny沒傳遞任何信息解決分析

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

    Golang中類型轉(zhuǎn)換利器cast庫(kù)的用法詳解

    cast庫(kù)是一個(gè)簡(jiǎn)潔而強(qiáng)大的第三方庫(kù),它的主要功能是實(shí)現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個(gè)常見且不可避免的過程,下面我們就來(lái)看看cast庫(kù)在Golang中的具體應(yīng)用吧
    2024-11-11
  • Go語(yǔ)言實(shí)現(xiàn)棧與隊(duì)列基本操作學(xué)家

    Go語(yǔ)言實(shí)現(xiàn)棧與隊(duì)列基本操作學(xué)家

    go語(yǔ)言中,并沒有棧與隊(duì)列相關(guān)的數(shù)據(jù)結(jié)構(gòu),但是我們可以借助切片來(lái)實(shí)現(xiàn)棧與隊(duì)列的操作;接下來(lái)我們一起實(shí)現(xiàn)棧與隊(duì)列基本操作,感興趣的可以了解一下
    2022-11-11
  • golang簡(jiǎn)單獲取上傳文件大小的實(shí)現(xiàn)代碼

    golang簡(jiǎn)單獲取上傳文件大小的實(shí)現(xiàn)代碼

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

    golang中的三個(gè)點(diǎn) ''...''的用法示例詳解

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

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

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

最新評(píng)論