# #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)
Комментарии:
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) {}