首页 >后端开发 >Golang >为什么在 Go 中调用方法时应避免使用指向接口值的指针?

为什么在 Go 中调用方法时应避免使用指向接口值的指针?

DDD
DDD原创
2024-12-07 05:15:16437浏览

Why Should I Avoid Using Pointers to Interface Values When Calling Methods in Go?

在 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 中的一些关键概念很重要:

  • 接口指针: 在 Go 中你永远不会使用指向接口值的指针。接口是抽象的,值类型。
  • 按值调用:在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn