【问题标题】:How to make a struct accept one of two types as an argument?如何使结构接受两种类型之一作为参数?
【发布时间】:2018-02-04 16:51:33
【问题描述】:

我有一个结构 DbConnector,我想将其用作与数据库通信的代理。

这个结构有方法Init(db *sql.DB)

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

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

【问题讨论】:

标签: go struct interface


【解决方案1】:

使用*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

希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 2016-09-23
    • 2012-06-02
    • 2016-09-18
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多