首页 > 后端开发 > Golang > 为什么在 Go 中调用接口指针的方法时会出现'未定义方法”错误?

为什么在 Go 中调用接口指针的方法时会出现'未定义方法”错误?

Susan Sarandon
发布: 2024-12-14 14:33:15
原创
677 人浏览过

Why Do I Get an

Golang 中调用接口指针的方法

在使用 Gorp 库访问数据库时,开发者经常会遇到需要调用接口指针方法的情况接口指针,同时保持回滚事务的能力。此问题是由于需要将 Gorp DbMap 或 Transaction 实例作为字段属性传递而引起的。

问题

如示例代码中所示,尝试调用方法在 SqlExecutor 接口上使用指针引用会导致未定义的方法错误。发生这种情况是因为类型 *gorp.SqlExecutor 没有 Get 方法,而 gorp.SqlExecutor 接口本身有。

解决方案

潜在的误解在于假设将指针传递给接口值提供与其他语言中的引用调用相同的行为。在 Go 中,使用接口指针有两个具体原因:

  1. 传递大型结构体值时优化性能。
  2. 允许被调用者修改原始值(当方法有一个指针接收器)。

这些原因都不适用于接口指针,因为接口值已经很小,无法通过接口值本身。相反,有必要修改存储在接口值中的值,该值通常是指向实际结构的指针。

正确实现

要解决此问题,代码应避免传递指向 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板