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

go語言實現(xiàn)依賴注入的示例代碼

 更新時間:2024年01月17日 09:09:06   作者:ldxxxxll  
依賴注入和控制反轉(zhuǎn)恰恰相反,它是一種具體的編碼技巧,我們不通過 new 的方式在類內(nèi)部創(chuàng)建依賴類的對象,而是將依賴的類對象在外部創(chuàng)建好之后,通過構造函數(shù)、函數(shù)參數(shù)等方式傳遞給類來使用,本文將給大家介紹go語言實現(xiàn)依賴注入,需要的朋友可以參考下

依賴注入(Dependency injection)

依賴注入和控制反轉(zhuǎn)恰恰相反,它是一種具體的編碼技巧。我們不通過 new 的方式在類內(nèi)部創(chuàng)建依賴類的對象,而是將依賴的類對象在外部創(chuàng)建好之后,通過構造函數(shù)、函數(shù)參數(shù)等方式傳遞(或注入)給類來使用。

DI(依賴性注入)是一種技術,當你的模塊間接地接受依賴性。他們不知道依賴的實現(xiàn),只知道接口。

我們?yōu)槭裁葱枰?/h2>

DI 可以幫助我們編寫低耦合的代碼。這意味著你將能夠隨時交換你的代碼,并有助于重用它們的一些部分。
在寫單元測試時,使用 mock 方式注入是一個非常好的實踐。

參考代碼

我們有一個小小的項目:main.go 和 兩個服務–日志和緩存

├───cmd
│       └───main.go
└───services
        ├───logger
        │       └───logger.go
        └───cache
                └───cache.go

它們是如何工作的?我們有一個緩存服務,如果你想把一些東西存儲在像Redis這樣的快速存儲中,就可以使用它。

// cache.go
import (
	"fmt"
	"sync"
)

// 將被注入的記錄器服務的接口,用小寫的方式來隱藏出口,是一個好的方式。
type logger interface {
	Error(error)
	Info(string)
}

type Cache struct {
	logger logger
	m      *sync.Map
}

// NewCache 我們服務的構造函數(shù),接收將被注入的服務的接口(我們可以注入幾個服務),并返回結(jié)構(緩存的實例)。
func NewCache(logger logger) *Cache {
	return &Cache{
		logger: logger,
		m:      new(sync.Map),
	}
}

func (r *Cache) Get(key string) (string, error) {
	rawValue, ok := r.m.Load(key)
	if !ok {
		err := fmt.Errorf("not found: %s", key)
		r.logger.Error(err)
		return "", err
	}
	return rawValue.(string), nil
}

func (r *Cache) Set(key string, data []byte) {
	r.m.Store(key, data)
	r.logger.Info(fmt.Sprintf("store key: %s", key))
}

日志服務用來對日志的持久化存儲以及分析

// logger.go
import "fmt"

type sentryClient interface {
	sendMessage(interface{})
}

type NormalSentryClient struct{}

func (s *NormalSentryClient) sendMessage(i interface{}) {
	fmt.Printf("send message %+v to sentry\n", i)
}

type Logger struct {
	sentry sentryClient
}

func NewLogger(sentryClient sentryClient) *Logger {
	return &Logger{
		sentry: sentryClient,
	}
}

// 我們看到這里有四個方法,但是 cache 對象只能看到兩個:Error 以及 Info
func (l *Logger) Error(e error) {
	fmt.Printf("[ERROR] %+v\n", e)
}

func (l *Logger) Info(msg string) {
	fmt.Printf("[INFO] %s\n", msg)
}

func (l *Logger) Debug(msg string) {
	fmt.Printf("[DEBUG] %s\n", msg)
}

func (l *Logger) Log(msg string) {
	fmt.Printf("[LOG] %s\n", msg)
}

// main.go
func main() {
	// 注冊服務
	sentryService := new(logger.NormalSentryClient)
	loggerService := logger.NewLogger(sentryService)
	cacheService := cache.NewCache(loggerService)

	cacheService.Set("test", []byte("test"))
	cacheService.Get("test1")
}

輸出:

[INFO] store key: test
[ERROR] not found: test1

golang DI 開源庫

  • inject:基于反射,運行時注入。但是已經(jīng)不維護了。
  • wire:AST,編譯期注入。
  • dig,F(xiàn)x:基于反射,運行時注入。

以上就是go語言實現(xiàn)依賴注入的示例代碼的詳細內(nèi)容,更多關于go實現(xiàn)依賴注入的資料請關注腳本之家其它相關文章!

相關文章

  • 基于go實例網(wǎng)絡存儲協(xié)議詳解

    基于go實例網(wǎng)絡存儲協(xié)議詳解

    這篇文章主要為大家介紹了基于go實例網(wǎng)絡存儲協(xié)議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Golang實現(xiàn)自定義recovery中間件

    Golang實現(xiàn)自定義recovery中間件

    在?Golang?的?Web?項目中,自定義?recovery?中間件是一種常見的做法,用于捕獲并處理應用程序的運行時錯誤,下面我們就來看看具體如何實現(xiàn)吧
    2023-09-09
  • Golang之模糊測試工具的使用

    Golang之模糊測試工具的使用

    本文主要介紹了Golang之模糊測試工具的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解

    Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解

    這篇文章主要給大家介紹了關于Go語言 channel如何實現(xiàn)歸并排序中merge函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02
  • 從基礎到高級詳解Go語言中錯誤處理的實踐指南

    從基礎到高級詳解Go語言中錯誤處理的實踐指南

    Go語言采用了一種獨特而明確的錯誤處理哲學,與其他主流編程語言形成鮮明對比,本文將為大家詳細介紹Go語言中錯誤處理詳細方法,希望對大家有所幫助
    2025-09-09
  • 在Gin框架中解決跨域問題的多種方法

    在Gin框架中解決跨域問題的多種方法

    在使用Go語言進行Web開發(fā)時,Gin框架因其簡潔、高效的特點而被廣泛使用,然而,在實際開發(fā)中,跨域問題(CORS, Cross-Origin Resource Sharing)是一個常見的挑戰(zhàn),本文將結(jié)合實際案例,詳細介紹在Gin框架中解決跨域問題的多種方法,需要的朋友可以參考下
    2024-10-10
  • Golang Model 字段自動化校驗設計方案

    Golang Model 字段自動化校驗設計方案

    在我們?nèi)粘i_發(fā)中,不可避免的總要去進行各種參數(shù)校驗,但是如果在某個場景中,要校驗的字段非常多,并且在其中還有耦合關系,那么我們手寫校驗邏輯就變得非常的低效且難以維護,本篇文檔就基于 DDD 領域模型設計的思想下,提供自動化的校驗模型字段,感興趣的朋友一起看看吧
    2025-02-02
  • Go slice切片使用示例詳解

    Go slice切片使用示例詳解

    這篇文章主要為大家介紹了Go slice切片使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解Go語言中單鏈表的使用

    詳解Go語言中單鏈表的使用

    鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行時動態(tài)生成。本文將通過實例為大家詳解Go語言中單鏈表的常見用法,感興趣的可以了解一下
    2022-08-08
  • 再次探討go實現(xiàn)無限 buffer 的 channel方法

    再次探討go實現(xiàn)無限 buffer 的 channel方法

    我們知道go語言內(nèi)置的channel緩沖大小是有上限的,那么我們自己如何實現(xiàn)一個無限 buffer 的 channel呢?今天通過本文給大家分享go實現(xiàn)無限 buffer 的 channel方法,感興趣的朋友一起看看吧
    2021-06-06

最新評論

新河县| 徐汇区| 嵊泗县| 涿鹿县| 农安县| 临漳县| 泽普县| 铜梁县| 新河县| 闵行区| 仙桃市| 贺兰县| 即墨市| 巫溪县| 阜平县| 沁水县| 延安市| 墨玉县| 梅河口市| 德阳市| 吐鲁番市| 汕尾市| 金乡县| 柳河县| 金山区| 临汾市| 西贡区| 宾川县| 北流市| 蓝山县| 谷城县| 延吉市| 皋兰县| 平舆县| 安达市| 呼玛县| 华阴市| 甘孜县| 抚松县| 始兴县| 枣强县|