在 Go 中调用接口指针上的方法
在 Go 中,您可能会遇到需要针对接口进行编程并使用事务而不修改您的代码。一种常见的方法是将指向“对象”的指针传递到字段属性中,以便在必要时启用回滚。然而,这种方法可能会导致混乱。
让我们考虑一个代码示例:
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp *gorp.SqlExecutor // Pointer to SqlExecutor } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) // Call method on pointer if err != nil { panic(err) } return obj }
在这里,您可能认为需要一个指向 Gorp“对象”的指针来执行回滚。然而,理解 Go 中的一些关键概念很重要:
在示例代码中,即使您有一个指向 Gorp SqlExecutor 的指针,您也无法调用接口指针本身的方法。相反,您正在调用基础值的方法。在这种情况下,底层值是一个 SqlExecutor 结构。
因此,您可以安全地从 Repository 结构中删除指针,只需将 SqlExecutor 接口传递给 Repository:
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp gorp.SqlExecutor // Pointer removed } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
This代码将按预期工作,并允许您在不修改底层 SqlExecutor 的情况下使用事务。您无需担心在此上下文中将指针传递给接口。
以上是为什么在 Go 中调用方法时应避免使用指向接口值的指针?的详细内容。更多信息请关注PHP中文网其他相关文章!