我有一个DbConnector
结构,我想用作与数据库通信的代理。
该结构具有方法Init(db *sql.DB)
。
根据条件,我希望能够使用其他结构(例如用于测试的DummyDatabaseConnection
)对其进行初始化。
如何定义Init()
的签名,以便它可以接受*sql.DB
或*DummyDatabaseConnection
?
最佳答案
使用一些需要调用*sql.DB
和*DummyDatabaseConnection
的方法来定义接口
type DBInterface interface {
Ping() error
Close() error
// Some other Methods that you need
}
现在,您的DummyDatabaseConnection应该满足您的DBInterface要求。
type DummyDatabaseConnection struct {
}
func(d *DummyDatabaseConnection) Ping()error {
return nil
}
func(d *DummyDatabaseConnection) Close()error {
return nil
}
使用您的接口作为参数
func (d *DbConnector) Init(db DBInterface) {
db.Ping()
db.Close()
}
致电您需要的那个。
dbConnector := &DbConnector{}
// Call with *sql.DB
db := &sql.DB{}
dbConnector.Init(db)
// Call with *DummyDatabaseConnection
db := &DummyDatabaseConnection{}
dbConnector.Init(db)
从
Init(db DBInterface)
方法中,您只能调用DBInterface接口中的方法检查this post
希望这会有所帮助