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

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

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

依賴注入(Dependency injection)

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

DI(依賴性注入)是一種技術(shù),當你的模塊間接地接受依賴性。他們不知道依賴的實現(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 我們服務的構(gòu)造函數(shù),接收將被注入的服務的接口(我們可以注入幾個服務),并返回結(jié)構(gòu)(緩存的實例)。
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)容,更多關(guān)于go實現(xiàn)依賴注入的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺析Go語言中的同步與異步處理

    淺析Go語言中的同步與異步處理

    在開發(fā)過程中,當需要同時處理多個操作時,開發(fā)者經(jīng)常面臨同步和異步兩種處理方式的選擇,下面小編就來和大家詳細介紹一下Go語言中的同步與異步處理吧
    2023-11-11
  • 在Mac中搭建go語言開發(fā)環(huán)境的操作步驟

    在Mac中搭建go語言開發(fā)環(huán)境的操作步驟

    go語言在開發(fā)效率和運行效率中的優(yōu)勢讓很多人青睞,所以有傾向打算轉(zhuǎn)向go語言的開發(fā)。下面介紹在Mac中g(shù)olang的開發(fā)環(huán)境配置。有需要的可以參考借鑒。
    2016-08-08
  • Go并發(fā)編程之死鎖與活鎖的案例分析

    Go并發(fā)編程之死鎖與活鎖的案例分析

    死鎖就是在并發(fā)程序中,兩個或多個線程彼此等待對方完成操作,從而導致它們都被阻塞,并無限期地等待對方完成;活鎖就是程序一直在運行,但是無法取得進展。本文將從一些案例出發(fā),分析一下它們,希望對大家有所幫助
    2023-04-04
  • Goland的設置與配置全過程

    Goland的設置與配置全過程

    這篇文章主要介紹了Goland的設置與配置全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • golang實現(xiàn)圖像驗證碼的示例代碼

    golang實現(xiàn)圖像驗證碼的示例代碼

    這篇文章主要為大家詳細介紹了如何利用golang實現(xiàn)簡單的圖像驗證碼,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • golang并發(fā)工具MapReduce降低服務響應時間

    golang并發(fā)工具MapReduce降低服務響應時間

    這篇文章主要為大家介紹了golang并發(fā)使用MapReduce降低服務響應時間實踐使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • 一文帶你掌握Go語言中文件的寫入操作

    一文帶你掌握Go語言中文件的寫入操作

    這篇文章主要和大家分享一下Go語言中文件的寫入操作,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作

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

    這篇文章主要介紹了go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解

    Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解

    這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang實現(xiàn)單元測試中的接口層

    Golang實現(xiàn)單元測試中的接口層

    接口層主要負責的就是請求的處理,最常見的就是?HTTP?請求的處理。這篇文章主要為大家介紹了Golang如何實現(xiàn)單元測試中的接口層,需要的可以參考一下
    2023-03-03

最新評論