当前位置: 首页 > 面试题库 >

在转到函数中通过引用和值传递

华懿轩
2023-03-14
问题内容

我对通过Go中的引用和值传递感到困惑。

我已经看到了在类型前面的*的解释。

  • 在类型名称前面表示已声明的变量将存储该类型的另一个变量的地址(而不是该类型的值)。

这对我来说毫无意义。

在Java中,如果我将数据库实例传递给函数,我会这样做

 databaseFunction(DatabaseType db) {
      // do something
}

但是在go示例中,我已经像这样通过了。

func PutTasks(db *sql.DB) echo.HandlerFunc {

}

为什么我们需要在类型前面加上星号?

根据这份备忘单,我发现了。

func PrintPerson(p * Person)仅接收指针地址(引用)

我不明白为什么我只想发送一个指针地址作为参数


问题答案:

首先,从技术上讲,Go仅具有按值传递。将指针传递给对象时,是按值传递指针,而不是按引用传递对象。差异是细微的,但有时是相关的。例如,您可以覆盖对调用者没有影响的指针值,而不是取消引用并覆盖它指向的内存。

// *int means you *must* pass a *int (pointer to int), NOT just an int!
func someFunc(x *int) {
    *x = 2 // Whatever variable caller passed in will now be 2
    y := 7
    x = &y // has no impact on the caller because we overwrote the pointer value!
}

关于您的问题“为什么我们需要在类型前面加上星号?”:星号表示该值的类型是指向指针的指针sql.DB,而不是type的值sql.DB。这些不可互换!

您为什么要发送指针地址?这样,您就可以在函数的调用者和函数主体之间共享值,并且在函数内部进行的更改会反映在调用者中(例如,指针是“
setter”方法可以在对象上工作的 唯一方式 ) 。Java总是按引用传递对象,而Go总是按值传递(即,它在函数中创建值的 副本
)。如果您将某些内容传递给函数,并且该函数修改了该值,则调用者将看不到这些更改。如果要更改以在函数外部传播,则必须传递一个指针。

另请参阅:指针上的“
转到”部分,指针上的“
转到规范”部分,地址运算符上的 “
转到规范”部分



 类似资料:
  • 本文向大家介绍JavaScript 通过引用或值传递参数,包括了JavaScript 通过引用或值传递参数的使用技巧和注意事项,需要的朋友参考一下 示例 在JavaScript中,所有参数均按值传递。当函数将新值分配给参数变量时,该更改将对调用者不可见: 但是,对此类参数的(嵌套)属性所做的更改对调用者将是可见的: 这可以看作是通过引用进行的调用:尽管函数无法通过为其分配新值来更改调用者的对象,但

  • 问题内容: 如何在Python中通过引用传递整数? 我想修改传递给函数的变量的值。我读过Python中的所有内容都是按值传递的,但是必须有一个简单的技巧。例如,在Java中,你可以通过引用类型的,等等。 如何通过引用将整数传递给函数? 最佳做法是什么? 问题答案: 在Python中,这种方式不太有效。Python将引用传递给对象。在函数内部,你有一个对象-你可以随意更改该对象(如果可能)。但是,整

  • 问题内容: Go中的地图是否通过值或引用传递? 始终可以将函数定义为以下形式,但这是一个过大的杀伤力吗? 相同的返回值问题。我应该返回指向地图的指针,还是将地图作为值返回? 这样做的目的当然是避免不必要的数据复制。 问题答案: 在此线程中,您将找到答案: Golang:使用地图参考来访问地图 您不需要在地图上使用指针。 映射类型是引用类型,例如指针或切片[1] 如果需要更改会话,可以使用一个指针:

  • 问题内容: 该程序给出6作为输出,但是当我取消注释第9行时,输出为5。为什么?我认为ba不应更改,主要应保持5。 问题答案: 在Java中传递对象时,它们将作为in 方法中引用的参考含义对象和method 中的参数传递,它们都指向同一对象,因此,当您将值更改为6时,它将反映在方法中。 现在,当您尝试执行此操作时,您将指向另一个对象,但仍指向您在方法中创建的对象,因此更新的值6在main方法中不可见

  • 问题内容: 有什么方法可以通过引用SASS中的另一个函数或mixin来传递函数或mixin,然后调用引用的函数或mixin? 例如: 问题答案: 在Sass中,函数和混合函数不是 一流 的,这意味着您不能像传递变量那样将它们作为参数传递。 最接近的指令是(Sass 3.2+)。 唯一需要注意的是,您无法看到mixin内部的内容。换句话说,如果仅在mixin 内部定义,则它实际上将不存在,因为不在范

  • 问题内容: 我有以下代码: 有人可以解释为什么输出是:零一二二。 摘自zend认证学习指南。 问题答案: 因为在第二个循环中,仍然是对最后一个数组项的引用,所以每次都将其覆盖。 您可以看到这样的内容: 如您所见,最后一个数组项采用当前循环值:“零”,“一个”,“两个”,然后就是“两个” …:)