Golang为何编译提示sql.Tx未实现driver.Tx接口
问题根因说明
- 你对
*sql.Tx实现了driver.Tx接口的认知是正确的:*sql.Tx确实包含Commit() error和Rollback() error两个方法,满足driver.Tx的接口约束,单独执行var _ driver.Tx = (*sql.Tx)(nil)不会触发编译错误。 - 本次报错的核心原因是Go的接口实现要求方法签名完全匹配,你定义的
db结构体没有满足store接口的方法要求:store接口要求的方法签名:Store(tx driver.Tx)- 你实际实现的方法签名:
Store(tx *sql.Tx)
二者参数类型不同,因此编译器判定db未实现store接口。
- 为什么哪怕
*sql.Tx实现了driver.Tx,方法签名也不算匹配?
接口定义的Store方法要求可以接收所有满足driver.Tx接口的类型作为入参,而你实现的Store方法仅能接收*sql.Tx这一种类型的入参,二者的能力范围不对等,因此编译器不会判定为合法的接口实现。
修复方案
- 方案一:调整
db的Store方法参数类型,匹配接口要求
// 方法参数改为driver.Tx类型,符合store接口约束 func (db) Store(tx driver.Tx) {}
调用该方法时可以直接传入*sql.Tx类型的变量,无需额外转换。
- 方案二:如果业务场景下
Store方法只会接收*sql.Tx类型的参数,可以直接调整store接口的定义
type store interface { Store(tx *sql.Tx) }
内容的提问来源于stack exchange,提问作者Cae Vecchi
相关产品推荐
相关产品推荐

