Голанг: Почему sql.Tx не реализует драйвер.Tx

# #go #go-interface

Вопрос:

Почему в следующем примере компилятор говорит 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

Комментарии:

1. Вы полностью прочитали сообщение об ошибке? Есть ли в этом что-то такое, чего вы не понимаете? (кстати, ошибка не утверждает, что sql.Tx не реализуется driver.Tx . Даже если он это реализует, это не делает эти типы взаимозаменяемыми ни в каком контексте, кроме назначения )

2. Обратите внимание, что обычный код приложения не имеет оснований для прямого использования пакета драйверов. Пакет интересен только для разработчиков.

3. Я ожидал, что, поскольку один интерфейс имеет параметр интерфейса, по какой-то причине я подумал, что разработчик, имеющий параметр, реализующий параметр интерфейса, будет работать.

Ответ №1:

Ваша реализация должна точно соответствовать, поэтому Store() должен принять драйвер.Тип TX. Не только *sql.Tx.

Потому что sql.Tx реализует драйвер.Интерфейс Tx он может быть предоставлен в качестве входного сигнала.

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

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

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

type db struct{}

func (db) Store(tx driver.Tx) {}