gpt4 book ai didi

Golang在接口(interface)指针上调用方法

转载 作者:IT老高 更新时间:2023-10-28 13:09:41 25 4
gpt4 key购买 nike

我正在使用 Gorp对于数据库访问,Gorp 有一个标准的 DbMap 类型,以及当您希望能够回滚时的 Transaction 类型。两种类型都实现了 SqlExecutor 接口(interface)。

因此,我正在针对 SqlExecutor 接口(interface)进行编程,因此我可以根据需要使用事务,而无需更改我的代码。

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

然后我会收到一条消息,例如

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
}

最佳答案

也许您对问题的思考过度,或者您可能仍然受到另一种语言的“引用调用”影响:

  1. gorp.SqlExecutor 是一个接口(interface),您永远不会使用指向接口(interface)值的指针。永远不能。 (从技术上讲,这是不正确的,但如果您确实需要指向接口(interface)的指针,那么您已经掌握了足够的 Go 来理解为什么“永远不会”是一个非常好的建议。)
  2. 永远不要考虑“引用调用”。 Go 中没有这样的东西。将指针传递给函数不是“通过引用调用”。把它抛在脑后。

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

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

1) 你想这样做,因为你的结构 真的 而且你想避免复制,或者

2) 你需要,因为被调用者想要修改原始的(这对于带有指针接收器的方法来说很典型)。

现在接口(interface)值非常小(只有两个字),所以原因 1,将指针传递给接口(interface)值,不适用。原因 2 在大多数情况下不适用,因为传递指向接口(interface)值的指针将允许您更改 interface value 本身,但大多数情况下您希望修改该值存储内部接口(interface)值。存储在接口(interface)值中的这个值通常是一个指针值,它允许通过调用接口(interface)值上的方法来更改结构的值,该接口(interface)值包装了指向该结构的指针。这听起来很复杂,但实际上并不复杂:新手 Go 程序员只是不使用指向接口(interface)的指针(因为这不会有任何好处),而有经验的 Go 程序员不使用指向接口(interface)的指针(因为它不会做太多好)除非他需要修改接口(interface)值,通常是在反射期间。

关于Golang在接口(interface)指针上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com