最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

抽象出生命周期接口

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

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

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

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

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

實現(xiàn)自動裝配

所有的啟動器都實現(xiàn)了 Starter 接口

這時就可以將所有的啟動器都放在一個切片中,然后遍歷切片,依次調(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
}

提供一個注冊和運行的方法,這樣就可以實現(xiàn)自動裝配了

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 函數(shù)中注冊

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 方法

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

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

相關(guān)文章

  • Go語言集成開發(fā)環(huán)境之VS Code安裝使用

    Go語言集成開發(fā)環(huán)境之VS Code安裝使用

    VS Code是微軟開源的一款編輯器,插件系統(tǒng)十分的豐富,下面介紹如何用VS Code搭建go語言開發(fā)環(huán)境,需要的朋友可以參考下
    2021-10-10
  • golang 之import和package的使用

    golang 之import和package的使用

    這篇文章主要介紹了golang 之import和package的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務(wù)器操作

    go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務(wù)器操作

    這篇文章主要介紹了go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務(wù)器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言服務(wù)器開發(fā)實現(xiàn)最簡單HTTP的GET與POST接口

    Go語言服務(wù)器開發(fā)實現(xiàn)最簡單HTTP的GET與POST接口

    這篇文章主要介紹了Go語言服務(wù)器開發(fā)實現(xiàn)最簡單HTTP的GET與POST接口,實例分析了Go語言http包的使用技巧,需要的朋友可以參考下
    2015-02-02
  • Go語言包和包管理詳解

    Go語言包和包管理詳解

    這篇文章主要為大家介紹了Go語言包和包管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Golang實現(xiàn)為圖片添加水印和文字的示例代碼

    Golang實現(xiàn)為圖片添加水印和文字的示例代碼

    在現(xiàn)代數(shù)字化和社交媒體的時代,圖片處理已經(jīng)成為了一項重要的技能,在本文中,我們將探討使用Golang進行圖片添加水印和文字,感興趣的小伙伴可以了解下
    2026-02-02
  • 源碼解析gtoken替換jwt實現(xiàn)sso登錄

    源碼解析gtoken替換jwt實現(xiàn)sso登錄

    這篇文章主要為大家介紹了源碼解析gtoken替換jwt實現(xiàn)sso登錄的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang切片初始化的使用示例

    golang切片初始化的使用示例

    Go語言中,切片可通過直接初始化、數(shù)組初始化、切片表達式等多種方法進行初始化,這些方式提供了靈活的數(shù)據(jù)管理方式,適合不同的編程需求和場景,感興趣的可以了解一下
    2024-10-10
  • Go語言基于viper的conf庫進行配置文件解析

    Go語言基于viper的conf庫進行配置文件解析

    在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點,下面我們來看看如何使用conf進行配置文件解析吧
    2025-03-03
  • 淺析GO語言的垃圾回收機制

    淺析GO語言的垃圾回收機制

    今天我們來聊聊golang是如何進行垃圾回收的,我們知道,目前各語言進行垃圾回收的方法有很多,如引用計數(shù)、標記清除、分代回收、三色標記等,各種方式都有其特點,文中介紹的非常詳細,感興趣的小伙伴跟著小編一起學(xué)習(xí)吧
    2023-07-07

最新評論

涪陵区| 兴文县| 凉山| 本溪| 临夏县| 黔江区| 广汉市| 贵州省| 宜兰县| 宁城县| 丰原市| 永清县| 斗六市| 克拉玛依市| 寿光市| 松滋市| 崇仁县| 齐河县| 翁源县| 博湖县| 屯门区| 南溪县| 浠水县| 措美县| 绵阳市| 扶余县| 马龙县| 云梦县| 上林县| 新乡县| 阆中市| 洞头县| 印江| 修文县| 黔西县| 蒲城县| 连南| 罗田县| 尼木县| 湘阴县| 双柏县|