成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > golang不到30行代碼實現(xiàn)依賴注入的方法

golang不到30行代碼實現(xiàn)依賴注入的方法

熱門標(biāo)簽:鄭州亮點科技用的什么外呼系統(tǒng) 釘釘有地圖標(biāo)注功能嗎 建造者2地圖標(biāo)注 黃岡人工智能電銷機器人哪個好 浙江高頻外呼系統(tǒng)多少錢一個月 惠州電銷防封電話卡 濱州自動電銷機器人排名 阿里云ai電話機器人 汕頭小型外呼系統(tǒng)

本文介紹了golang不到30行代碼實現(xiàn)依賴注入的方法,分享給大家,具體如下:

項目地址

go-di-demo

本項目依賴

使用標(biāo)準(zhǔn)庫實現(xiàn),無額外依賴

依賴注入的優(yōu)勢

用java的人對于spring框架一定不會陌生,spring核心就是一個IoC(控制反轉(zhuǎn)/依賴注入)容器,帶來一個很大的優(yōu)勢是解耦。一般只依賴容器,而不依賴具體的類,當(dāng)你的類有修改時,最多需要改動一下容器相關(guān)代碼,業(yè)務(wù)代碼并不受影響。

golang的依賴注入原理

總的來說和java的差不多,步驟如下:(golang不支持動態(tài)創(chuàng)建對象,所以需要先手動創(chuàng)建對象然后注入,java可以直接動態(tài)創(chuàng)建對象)

  • 通過反射讀取對象的依賴(golang是通過tag實現(xiàn))
  • 在容器中查找有無該對象實例
  • 如果有該對象實例或者創(chuàng)建對象的工廠方法,則注入對象或使用工廠創(chuàng)建對象并注入
  • 如果無該對象實例,則報錯

代碼實現(xiàn)

一個典型的容器實現(xiàn)如下,依賴類型參考了spring的singleton/prototype,分別對象單例對象和實例對象:

package di

import (
 "sync"
 "reflect"
 "fmt"
 "strings"
 "errors"
)

var (
 ErrFactoryNotFound = errors.New("factory not found")
)

type factory = func() (interface{}, error)
// 容器
type Container struct {
 sync.Mutex
 singletons map[string]interface{}
 factories map[string]factory
}
// 容器實例化
func NewContainer() *Container {
 return Container{
  singletons: make(map[string]interface{}),
  factories: make(map[string]factory),
 }
}

// 注冊單例對象
func (p *Container) SetSingleton(name string, singleton interface{}) {
 p.Lock()
 p.singletons[name] = singleton
 p.Unlock()
}

// 獲取單例對象
func (p *Container) GetSingleton(name string) interface{} {
 return p.singletons[name]
}

// 獲取實例對象
func (p *Container) GetPrototype(name string) (interface{}, error) {
 factory, ok := p.factories[name]
 if !ok {
  return nil, ErrFactoryNotFound
 }
 return factory()
}

// 設(shè)置實例對象工廠
func (p *Container) SetPrototype(name string, factory factory) {
 p.Lock()
 p.factories[name] = factory
 p.Unlock()
}

// 注入依賴
func (p *Container) Ensure(instance interface{}) error {
 elemType := reflect.TypeOf(instance).Elem()
 ele := reflect.ValueOf(instance).Elem()
 for i := 0; i  elemType.NumField(); i++ { // 遍歷字段
  fieldType := elemType.Field(i)
  tag := fieldType.Tag.Get("di") // 獲取tag
  diName := p.injectName(tag)
  if diName == "" {
   continue
  }
  var (
   diInstance interface{}
   err  error
  )
  if p.isSingleton(tag) {
   diInstance = p.GetSingleton(diName)
  }
  if p.isPrototype(tag) {
   diInstance, err = p.GetPrototype(diName)
  }
  if err != nil {
   return err
  }
  if diInstance == nil {
   return errors.New(diName + " dependency not found")
  }
  ele.Field(i).Set(reflect.ValueOf(diInstance))
 }
 return nil
}

// 獲取需要注入的依賴名稱
func (p *Container) injectName(tag string) string {
 tags := strings.Split(tag, ",")
 if len(tags) == 0 {
  return ""
 }
 return tags[0]
}

// 檢測是否單例依賴
func (p *Container) isSingleton(tag string) bool {
 tags := strings.Split(tag, ",")
 for _, name := range tags {
  if name == "prototype" {
   return false
  }
 }
 return true
}

// 檢測是否實例依賴
func (p *Container) isPrototype(tag string) bool {
 tags := strings.Split(tag, ",")
 for _, name := range tags {
  if name == "prototype" {
   return true
  }
 }
 return false
}

// 打印容器內(nèi)部實例
func (p *Container) String() string {
 lines := make([]string, 0, len(p.singletons)+len(p.factories)+2)
 lines = append(lines, "singletons:")
 for name, item := range p.singletons {
  line := fmt.Sprintf(" %s: %x %s", name, item, reflect.TypeOf(item).String())
  lines = append(lines, line)
 }
 lines = append(lines, "factories:")
 for name, item := range p.factories {
  line := fmt.Sprintf(" %s: %x %s", name, item, reflect.TypeOf(item).String())
  lines = append(lines, line)
 }
 return strings.Join(lines, "\n")
}
  • 最重要的是Ensure方法,該方法掃描實例的所有export字段,并讀取di標(biāo)簽,如果有該標(biāo)簽則啟動注入。
  • 判斷di標(biāo)簽的類型來確定注入singleton或者prototype對象

測試

  1. 單例對象在整個容器中只有一個實例,所以不管在何處注入,獲取到的指針一定是一樣的。
  2. 實例對象是通過同一個工廠方法創(chuàng)建的,所以每個實例的指針不可以相同。

下面是測試入口代碼,完整代碼在github倉庫,有興趣的可以翻閱:

package main

import (
 "di"
 "database/sql"
 "fmt"
 "os"
 _ "github.com/go-sql-driver/mysql"
 "demo"
)

func main() {
 container := di.NewContainer()
 db, err := sql.Open("mysql", "root:root@tcp(localhost)/sampledb")
 if err != nil {
  fmt.Printf("error: %s\n", err.Error())
  os.Exit(1)
 }
 container.SetSingleton("db", db)
 container.SetPrototype("b", func() (interface{}, error) {
  return demo.NewB(), nil
 })

 a := demo.NewA()
 if err := container.Ensure(a); err != nil {
  fmt.Println(err)
  return
 }
 // 打印指針,確保單例和實例的指針地址
 fmt.Printf("db: %p\ndb1: %p\nb: %p\nb1: %p\n", a.Db, a.Db1, a.B, a.B1)
}

執(zhí)行之后打印出來的結(jié)果為:

db: 0xc4200b6140
db1: 0xc4200b6140
b: 0xc4200a0330
b1: 0xc4200a0338

可以看到兩個db實例的指針一樣,說明是同一個實例,而兩個b的指針不同,說明不是一個實例。

寫在最后

通過依賴注入可以很好的管理多個對象之間的實例化以及依賴關(guān)系,配合配置文件在應(yīng)用初始化階段將需要注入的實例注冊到容器中,在應(yīng)用的任何地方只需要在實例化時注入容器即可。沒有額外依賴。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang使用 gomodule 在公共測試環(huán)境管理go的依賴的實例詳解
  • 解決vscode中g(shù)olang插件依賴安裝失敗問題
  • golang 如何自動下載所有依賴包

標(biāo)簽:滄州 東營 泰安 昭通 駐馬店 瀘州 阿壩 晉中

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang不到30行代碼實現(xiàn)依賴注入的方法》,本文關(guān)鍵詞  golang,不到,30行,代碼,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang不到30行代碼實現(xiàn)依賴注入的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang不到30行代碼實現(xiàn)依賴注入的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    中文在线二区| 国产一级黄色电影| 国产又大又黄又粗又爽| 91欧美大片| 国产精品色呦呦| 久久这里只有精品视频首页| 日韩欧美视频一区| 91久久国产精品91久久性色| 亚洲大尺度视频在线观看| av成人在线观看| 99re久久最新地址获取| 国产欧美精品日韩区二区麻豆天美| 成人福利片在线| 在线观看你懂的视频| 欧美做暖暖视频| 美女精品在线| 国产黄色在线免费观看| 亚洲午夜精品在线观看| 911国产网站尤物在线观看| 国产精品成人一区二区三区吃奶| 中文字幕人妻一区二区三区视频| 国产美女情趣调教h一区二区| 在线国产一级| 神马午夜伦理影院| 国产成人激情视频| 免费的黄网站在线观看| 一二三四中文字幕| 欧美视频精品| 欧美一区2区三区4区公司二百| 欧美日本在线视频中文字字幕| 99久久国产综合精品色伊| 好吊色欧美一区二区三区视频| 亚洲精品国产无套在线观| 在线观看免费国产视频| 亚洲aaa视频| 亚洲av无码国产综合专区| 国产福利短视频| 国产三区在线成人av| 久草福利资源站| 成年网站在线| 亚洲大片精品免费| 国产精品久久在线| 久久综合影音| 欧美精品免费观看二区| 精品国产导航| 亚洲毛片播放| 巨胸喷奶水www久久久免费动漫| 欧美日韩电影在线观看| 一个人看的www视频在线免费观看| 精品久久久香蕉免费精品视频| 中文字幕精品视频| 99精品国产在热久久| 国产精品久久久久精| zzjj国产精品一区二区| 97av中文字幕| 综合国产在线| 人妻丰满熟妇av无码久久洗澡| 奇米精品一区二区三区在线观看一| 猫咪成人在线观看| 久久久精品一区二区毛片免费看| 91精品国产成人www| 中文字幕天天干| 中文字幕日韩第一页| 国产精品黄色| 综合电影一区二区三区| 丰满放荡岳乱妇91ww| 亚洲人妖av一区二区| 久久午夜鲁丝片| 成人妖精视频yjsp地址| 国产日本欧美视频| 极品白浆推特女神在线观看| 欧美日韩在线一区| 国产精品高潮久久久久无| 久久久久久亚洲中文字幕无码| 日韩av加勒比| 国产成人综合网| 久草国产视频| 欧美一区二区三区在线播放| 国产精品无码免费播放| 国内精品久久久久国产盗摄免费观看完整版| 97超碰人人看人人| 成人av色在线观看| 成人性生交大片免费看96| 精品少妇一区二区三区在线| 99高清免费国产自产拍| 日韩欧美一区二区久久婷婷| 黄www在线观看| 免费黄色小网站| 欧美日韩中文一区| 国产精品久久久久久免费观看| 日本中文字幕网| 两个人hd高清在线观看| 国产福利小视频| 亚洲精品午夜久久久久久久| 国产精品jizz在线观看美国| 黑人玩弄人妻一区二区三区| 中文字幕制服丝袜一区二区三区| 久草国产在线观看| 免费在线亚洲欧美| 欧美极品美女视频| 黄色录像一级片| 久久无码人妻精品一区二区三区| 精品久久久久久久免费人妻| 色午夜这里只有精品| 欧美一区二区福利视频| 99国产精品久久久久99打野战| 成年大片免费视频播放二级| 欧美日韩在线视频播放| 久久免费播放视频| 在线观看中文字幕不卡| 97碰碰碰免费色视频| 偷拍盗摄高潮叫床对白清晰| 亚洲视频免费| 男人天堂新网址| 国产在线播放观看| 亚洲欧美韩国| 99re在线观看| 中文字幕在线一区| 亚洲日本在线观看| 久久久久久一区二区三区四区别墅| 中文在线天堂网www| 国产午夜精品久久久| 91精品国偷自产在线电影| 深夜福利网站| 亚洲精品一二三四五区| 色视频在线观看在线播放| 精品视频网站| 日韩精品中文字幕在线一区| 午夜一级免费视频| 久久久精品视频在线观看| 亚洲国产成人精品久久| 欧美国产一区二区| 日韩一区av在线| 亚洲成年人av| 任你弄在线视频免费观看| 日本熟妇毛耸耸xxxxxx| 中文字幕这里只有精品| 97公开免费视频| 久久久久国产成人精品亚洲午夜| 91精品国产91久久久久久| 中文字幕日韩亚洲| 国产精品久久久久久久久果冻传媒| 久热中文在线| 精品国产乱码久久久久久108| 久久久人成影片一区二区三区| 小草在线视频免费播放| 国产成人高清精品免费5388| 日本中文字幕不卡免费| 国产一区二区三区视频在线播放| 国产麻豆免费视频| 午夜精品久久久久久99热软件| 国产嫩草在线观看| 精品福利视频导航| 深夜福利免费在线观看| 国产成人无码aa精品一区| 国产欧亚日韩视频| 免费h网站在线观看| 一区二区三区资源| 日本丰满www色| 久久69成人| 日本道精品一区二区三区| ijzzijzzij亚洲大全| 91麻豆免费观看| 国产视频亚洲视频| 538在线一区二区精品国产| 最新国产一区| 亚洲动漫在线观看| 亚洲国产99精品国自产| 国产福利一区二区三区视频在线| 国产无套内射久久久国产| 国产一区亚洲| 精品久久久久一区二区| 免费在线稳定资源站| 在线看黄色av| 久久不见久久见中文字幕免费| 日韩欧美高清在线播放| 男人日女人逼逼| 激情综合婷婷| 在线看成人短视频| 九色国产蝌蚪| 亚洲国产成人久久| 国产日韩亚洲精品| jizzjizz少妇亚洲水多| 国产成人亚洲欧美| 欧美黑人一区二区| 91精品国产乱码在线观看| 欧美涩涩视频| 麻豆tv免费在线观看| 免费在线播放第一区高清av| eeuss影院www免费视频| 国产精品99久久免费观看| 美女一级全黄| 女同互添互慰av毛片观看| 一级全黄少妇性色生活片| 中国人xxxxx69免费视频| 99久久久国产精品免费调教网站| 少妇av一区二区三区无码| 国产一区二区欧美日韩| 久久亚洲精品国产亚洲老地址| 欧美少妇xxxx| 欧美精品一区二区三区久久久竹菊| 天天影视综合色| 国产精品视频网站| 国产成人精品在线视频| 亚洲制服丝袜一区| 男人的天堂最新网址| 九九九伊在人线综合| 一级片在线免费观看视频| 国产精品麻豆网站| 91美女高潮出水| 成人在线视频网址| 色欲av永久无码精品无码蜜桃| av电影一区| 久久综合av免费| 艳色歌舞团一区二区三区| 欧美激情15p| 日韩精品一卡| 欧美激情免费视频| 性国裸体高清亚洲| 豆国产96在线|亚洲| 国产福利久久久| 精品视频一区二区三区四区五区| 国产精品久久久久久久久免费看| 日韩大尺度黄色| 欧美怡红院视频| 亚洲男人的天堂网站| 久久久www成人免费精品张筱雨| 精品欧美日韩精品| 亚洲精品亚洲人成人网在线播放| 亚洲午夜精品国产| 亚洲都市激情| 国产第一页第二页| 精品国产av 无码一区二区三区| 欧美系列电影免费观看| 激情综合激情五月| 性欧美ⅴideo另类hd| 每日更新在线观看av| 欧美精品国产精品| 免费av片风间由美在线| 中文字幕一区在线播放| 3d动漫精品啪啪1区2区免费| 男女羞羞视频网站| 欧美精品免费视频| 国产精品一区二区三区乱码| 中文字幕在线观看网站| 99热这里都是精品| 国产日韩高清在线| 亚洲成人一区二区三区| 亚洲人成网站在线播| 国产高清一级毛片在线不卡| 亚洲精品tv久久久久久久久| 91精品一区二区三区在线观看| 国产在线高清视频| 国产日韩在线免费| 欧美色综合天天久久综合精品| caoporn免费在线视频| 麻豆av免费在线| 国产suv精品一区二区三区| 岛国av一区二区三区| 亚洲人成电影网站| 久久影院午夜精品| 久久久免费人体| 久久av网站| 欧美丝袜丝nylons| 中文字幕少妇一区二区三区| 日本成人一区| 一区二区三区四区精品视频| 久久手机精品视频| 欧美另类极限扩张| 国产91精品入口17c| 国产男女无遮挡| 狠狠色2019综合网| 天天操夜夜操天天射| 国产成人精品一区二区在线| 亚洲欧洲一二区| 天堂网在线资源| 在线观看你懂| 伊人亚洲精品| 午夜成年人在线免费视频| 国产一级粉嫩xxxx| 国产成人亚洲综合a∨婷婷| av文字幕在线观看| 一区二区在线观看视频在线| 午夜久久tv| 日韩成人dvd| 久久久久久久国产精品视频| 成人激情av在线| 精品国产91洋老外米糕| 欧美大荫蒂xxx| 亚洲第一男人天堂| 欧美性少妇18aaaa视频| 国产成人久久精品77777最新版本| 亚洲精品高清国产一线久久| 国产suv精品一区二区| 日韩av一区二区在线观看| 91玉足脚交嫩脚丫在线播放| 91国内在线视频| 极品尤物久久久av免费看| 91国产精品| 丰乳肥臀在线| 欧美日韩在线网站| 免费av不卡在线观看| 天天影视综合| 8x国产一区二区三区精品推荐| 黄色a一级视频| 国产精品xxxx| 日本国产一区二区三区| 三年片观看免费观看大全视频下载| 69久久夜色精品国产69蝌蚪网| 久久久99免费视频| 亚洲av成人精品日韩在线播放| 性生活一级大片| 日本成人一区二区| 黄色免费网站在线观看| 午夜精品一区在线观看| 亚洲一级黄色录像| 国产精品12345| 久久看人人爽人人| 韩国av电影免费观看| 高清欧美电影在线| 亚洲精品久久久久久久久久久久久| 亚洲韩国欧洲国产日产av| 91精品久久久久久| jizzjizzjizz中国免费| 亚洲一区二区不卡视频| 国产69精品久久久久久久久久| caoporn97在线视频| 97视频精彩视频在线观看|