如何使结构接受两种类型中的一种作为参数?

时间:2018-02-04 16:51:33

标签: go struct interface

我有一个结构DbConnector,我想用它作为代理来与数据库进行通信。

此结构具有方法Init(db *sql.DB)

根据条件,我希望能够使用其他结构初始化它,例如DummyDatabaseConnection进行测试。

如何定义Init()的签名,使其接受*sql.DB*DummyDatabaseConnection

1 个答案:

答案 0 :(得分:2)

使用您需要为*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

希望这会有所帮助