Golang 中调用接口指针的方法
在使用 Gorp 库访问数据库时,开发者经常会遇到需要调用接口指针方法的情况接口指针,同时保持回滚事务的能力。此问题是由于需要将 Gorp DbMap 或 Transaction 实例作为字段属性传递而引起的。
问题
如示例代码中所示,尝试调用方法在 SqlExecutor 接口上使用指针引用会导致未定义的方法错误。发生这种情况是因为类型 *gorp.SqlExecutor 没有 Get 方法,而 gorp.SqlExecutor 接口本身有。
解决方案
潜在的误解在于假设将指针传递给接口值提供与其他语言中的引用调用相同的行为。在 Go 中,使用接口指针有两个具体原因:
这些原因都不适用于接口指针,因为接口值已经很小,无法通过接口值本身。相反,有必要修改存储在接口值中的值,该值通常是指向实际结构的指针。
正确实现
要解决此问题,代码应避免传递指向 Gorp“对象”的指针,而应直接传递接口值。以下代码正确地实现了这种方法:
package repositories import "github.com/coopernurse/gorp" type Repository struct { Gorp gorp.SqlExecutor // Pass the interface value directly } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
通过按值而不是按引用传递接口值,代码可以维护所需的功能,同时遵守 Go 中指针的正确用法。
以上是为什么在 Go 中调用接口指针的方法时会出现'未定义方法”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!