我使用戈尔普进行数据库访问,Gorp有一个标准的DbMap类型,以及一个希望回滚的Transaction类型。两种类型都实现了SqlExecutor接口。
因此,我正在针对SqlExecutor接口进行编程,因此,如果我愿意,可以使用事务,而不需要更改代码。
然后初始化一个Gorp DbMap或Transaction,并将其作为字段属性传入。问题是,我需要一个指向Gorp "object“的指针,否则,如果通过值而不是引用传递Transaction,我将如何回滚。
然后我收到一条消息,如
r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)当我尝试使用我的代码时。我该如何调用这些方法?
下面是一个代码示例。
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
}发布于 2014-01-22 12:33:15
也许你正在过度思考这个问题,或者你可能仍然受到另一种语言的“指代”的影响:
gorp.SqlExecutor是一个接口,您永远不会使用指向接口值的指针。永远不要。(从技术上讲,这是不正确的,但如果你真的需要一个指向接口的指针,你就已经掌握了足够多的知识去理解为什么“永远不会”是一个非常好的建议。)我假设您没有尝试使用事务并对非指针到接口的代码进行回滚?
背景:在Go中,由于两个原因,您传递指向某物的指针:
1)您希望这样做,因为您的结构非常大,您希望避免复制,或者
2)您需要修改,因为被调用方希望修改原始文件(这对于带有指针接收器的方法来说是典型的)。
现在,接口值确实很小(只有两个单词),因此传递指向接口值的指针的原因1不适用。在大多数情况下,原因2并不适用,因为传递指向接口值的指针将允许您更改接口值本身,但通常您希望修改存储在接口值中的值。存储在接口值中的这个值通常是一个指针值,它允许通过调用包含指向此结构的指针的接口值的方法来更改结构的值。这听起来很复杂,但事实并非如此:新手Go程序员只是不使用指向接口的指针(因为这不会有任何好处),经验丰富的Go程序员也不会使用指向接口的指针(因为这样做不会有多大好处),除非他需要修改接口值,通常是在反射过程中。
发布于 2014-05-30 18:17:52
gorp.SqlExecutor是一个接口,您永远不会使用指向接口值的指针。永远不要。https://stackoverflow.com/questions/21282741
复制相似问题