-1

为什么在下面的示例中编译器说不sql.Tx实现driver.Tx,看到sql.Tx确实实现了接口:

import (
    "database/sql"
    "database/sql/driver"
)


func main() {
    var myDB store = db{}
}

type store interface {
    Store(tx driver.Tx)
}

type db struct {}

func (db) Store(tx *sql.Tx) {}
type Tx interface {
    Commit() error
    Rollback() error
}
./prog.go:9:6: cannot use db{} (type db) as type store in assignment:
    db does not implement store (wrong type for Store method)
        have Store(*sql.Tx)
        want Store(driver.Tx)

https://play.golang.org/p/p3vryYI_dhV

4

1 回答 1

1

您的实现需要完全匹配,因此 Store() 必须接受 driver.TX 类型。不仅是 *sql.Tx。

因为 sql.Tx 实现了 driver.Tx 接口,所以它可以作为输入提供。

import (
    "database/sql"
    "database/sql/driver"
)

func main() {
    var myDB store = db{}
    sqlTx := &sql.Tx{}
    myDB.Store(sqlTx)
}

type store interface {
    Store(tx driver.Tx)
}

type db struct{}

func (db) Store(tx driver.Tx) {}
于 2021-09-15T23:19:33.543 回答