亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用接口在 Golang 中為數據庫實現依賴注入

如何使用接口在 Golang 中為數據庫實現依賴注入

Go
九州編程 2022-06-01 18:09:22
我有以下代碼嘗試使用數據庫實現依賴注入,以便稍后在測試中模擬它。問題是編譯器無法識別 db 作為實現接口: cannot use db (type *sqlx.DB) as type storage in field value: *sqlx.DB does not implement storage.package mainfunc main() {    db, _ := database.NewDB()    api, _ := controllers.NewAPI(db)    api.Register(data)}控制器/main.gopackage controllerstype storage interface {    AccountExists(id int64)}type API struct {    storage}func NewAPI(db *sqlx.DB) (*API, error) {    return &API{db}, nil}func (api *API) Register(userdata) {    // register user here}存儲/數據庫.gopackage databasefunc NewDB() (*sqlx.DB, error) {    // connect to db ere    return database, nil}type DB struct {    *sqlx.DB}func (db *DB) Account(id int64) (bool, error) {    // query db here}我已經嘗試實現 in 的類型DB,controllers但是如果我不聲明它,database我將無法在其中定義它的方法,并且如果我在兩者中都聲明它,編譯器將不會將其識別為實現接口。我想我已經接近實現這一點,但我真的嘗試了所有我能想到的。
查看完整描述

1 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

您走在正確的軌道上,但是與接口相關的代碼中存在一些錯誤。


為了讓結構實現你的storage接口,它需要一個帶有簽名的方法AccountExists(id int64)。根據規范(https://godoc.org/github.com/jmoiron/sqlx#DB)sqlx.Db沒有具有此簽名的方法。


你需要做的是這樣的:


package database


func NewMyDB() (*MyDB, error) {

    dbConnection := // get an *sqlx.DB instance

    return &MyDB{db: dbConnection}, nil

}


type MyDB struct {

    db *sqlx.DB

}


func (db *MyDB) AccountExists(id int64) {

    // query db here

}

控制器:


type storage interface {

    AccountExists(id int64)

}


type API struct {

    db storage

}


func NewAPI(db storage) (*API, error) {

    return &API{db}, nil

}

注意幾件事。1. 以前,您的NewMyDB構造函數返回的是結構的實例sqlx.DB而不是結構的實例(我將其重命名為MyDB避免與sqlx.DB類混淆)。2.以前你的MyDB結構沒有帶有簽名的方法 AccountExists(id int64)。因此它沒有實現storage,因為storage需要這個方法。


我建議閱讀一些關于接口如何在 Golang 中工作的內容。我認為這對解決您的問題有很大幫助。這是一個您可以快速閱讀的鏈接(其中包括另一個指向更長但有用的博客文章的鏈接):https ://gobyexample.com/interfaces


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號