首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口指针上的Golang调用方法

接口指针上的Golang调用方法
EN

Stack Overflow用户
提问于 2014-01-22 12:17:24
回答 2查看 19.3K关注 0票数 16

我使用戈尔普进行数据库访问,Gorp有一个标准的DbMap类型,以及一个希望回滚的Transaction类型。两种类型都实现了SqlExecutor接口。

因此,我正在针对SqlExecutor接口进行编程,因此,如果我愿意,可以使用事务,而不需要更改代码。

然后初始化一个Gorp DbMapTransaction,并将其作为字段属性传入。问题是,我需要一个指向Gorp "object“的指针,否则,如果通过值而不是引用传递Transaction,我将如何回滚。

然后我收到一条消息,如

代码语言:javascript
复制
r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)

当我尝试使用我的代码时。我该如何调用这些方法?

下面是一个代码示例。

代码语言:javascript
复制
package repositories

import (
    "github.com/coopernurse/gorp"
)


type Repository struct {
    Gorp *gorp.SqlExecutor // <<<< Need pointer so I can rollback
}

func (r *Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}
EN

回答 2

Stack Overflow用户

发布于 2014-01-22 12:33:15

也许你正在过度思考这个问题,或者你可能仍然受到另一种语言的“指代”的影响:

  1. gorp.SqlExecutor是一个接口,您永远不会使用指向接口值的指针。永远不要。(从技术上讲,这是不正确的,但如果你真的需要一个指向接口的指针,你就已经掌握了足够多的知识去理解为什么“永远不会”是一个非常好的建议。)
  2. 永远不要想到“参照打电话”。没有这样的东西在去。传递指向函数的指针不是“通过引用调用”。别管那个了。

我假设您没有尝试使用事务并对非指针到接口的代码进行回滚?

背景:在Go中,由于两个原因,您传递指向某物的指针:

1)您希望这样做,因为您的结构非常大,您希望避免复制,或者

2)您需要修改,因为被调用方希望修改原始文件(这对于带有指针接收器的方法来说是典型的)。

现在,接口值确实很小(只有两个单词),因此传递指向接口值的指针的原因1不适用。在大多数情况下,原因2并不适用,因为传递指向接口值的指针将允许您更改接口值本身,但通常您希望修改存储在接口值中的值。存储在接口值中的这个值通常是一个指针值,它允许通过调用包含指向此结构的指针的接口值的方法来更改结构的值。这听起来很复杂,但事实并非如此:新手Go程序员只是不使用指向接口的指针(因为这不会有任何好处),经验丰富的Go程序员也不会使用指向接口的指针(因为这样做不会有多大好处),除非他需要修改接口值,通常是在反射过程中。

票数 21
EN

Stack Overflow用户

发布于 2014-05-30 18:17:52

  1. gorp.SqlExecutor是一个接口,您永远不会使用指向接口值的指针。永远不要。
  2. 如果这是你的目标,你就错了。接口是一个包装器,是一个保证行为的契约。如果您的接口要求方法改变实现类型,那么实现类型应该是一个指针。指向接口本身的指针不会突然使实现类型可变。
  3. 你的结构应该是 类型Repository { Gorp gorp.SqlExecutor } func (r *Repository) GetById(i接口{},键接口{})接口{}{ obj,err := r.Gorp.(gorp.SqlExecutor).Get(i,key)如果err != nil { panic(err) }返回obj }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21282741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档