在測試數據庫方法時,我創建了一個包含數據庫/ sql包的最小包裝,以允許我測試接口而不是難以設置具體類。但是,我得到以下錯誤,當我嘗試模擬sql.Stmt:在Go中嘲笑數據庫/ sql結構
cannot use *sql.Stmt as type IStmt in return argument:
*sql.Stmt does not implement IStmt (wrong type for Query method)
have Query(...interface {}) (*sql.Rows, error)
want Query(...interface {}) (IRows, error)
這裏是我的接口:
type IStmt interface {
Query(args ...interface{}) (IRows, error)
QueryRow(args ...interface{}) IRow
}
type IRows interface {
Columns() ([]string, error)
Next() bool
Close() error
Scan(dest ...interface{}) error
Err() error
}
和這裏的問題方法:
func (c *DbConnection) Prepare(query string) (IStmt, error) {
return c.conn.Prepare(query)
}
我知道Go的優點之一就是可以創建自己的接口,任何實現它的結構都會自動「實現」它,而不必在java或us中使用implements
關鍵字e像C#中的分號子類。爲什麼它不使用這種返回類型?難道我做錯了什麼?
'* sql.Rows'沒有實現'IStmt',所以你不能返回它。更改界面以返回具體類型(最快修復)。我還建議閱讀[Effective Go](https://golang.org/doc/effective_go.html#interface-names)並查看你的界面命名(即'Queryer'或'Queryable')和/或閱讀https ://robots.thoughtbot.com/interface-with-your-database-in-go – elithrar
但是* sql.Stmt實現了和我一樣的Query方法和QueryRow方法。 Query(args ... interface {})(* Rows,error)'和'QueryRow(args ... interface {})* Row'。當然,我使用接口來表示'* sql.Rows'和'* sql.Row',但我使用的方法簽名完全相同。如果我改變這些方法分別返回'* sql.Rows'和'* sql.Row',它就會起作用。如果Go無法處理返回類型的嵌套接口,那真是太遺憾了! –