卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35521本站已运行397

在 Go to 函数中通过引用和值传递

在 go to 函数中通过引用和值传递

在PHP开发中,Go to 函数是一个非常常用的函数,可以用于控制程序的流程。在使用Go to函数时,我们有两种传递参数的方式:通过引用和通过值传递。通过引用传递参数时,函数内部对参数的修改会影响到函数外部的变量值。而通过值传递参数时,函数内部对参数的修改不会影响到函数外部的变量值。因此,在编写函数时,我们需要根据实际需求选择合适的参数传递方式,以实现预期的程序逻辑。在本文中,我将详细介绍在Go to函数中通过引用和值传递的用法和区别,以帮助读者更好地理解和应用这一重要的PHP函数。

问题内容

我对 go 中通过引用和值传递有点困惑。

我已经看到过对类型前面的 * 的解释。


* in front of a type name, means that the declared variable will store an address of another variable of that type (not a value of that
type).

这对我来说毫无意义。

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

databasefunction(databasetype db) {
      // do something
}

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

func puttasks(db *sql.db) echo.handlerfunc {

}

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

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


func PrintPerson(p *Person)   ONLY receives the pointer address
(reference)

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

解决方法

首先,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 类型的指针,而不是 sql.db 类型的值。这些不可互换!

为什么要发送指针地址?这样您就可以在函数的调用者和函数体之间共享值,并将函数内部所做的更改反映在调用者中(例如,指针是“setter”的唯一方式方法可以作用于对象)。这实际上也是您的 java 代码正在做的事情;在 java 中,您总是通过引用(指针)访问对象,因此 java 会自动执行此操作,而不是让您显式指示它。但在 go 中,您还可以通过指针访问对象,因此您必须明确。如果您调用函数并直接传入一个对象,该函数将获得该对象的副本,并且如果该函数修改该对象,则调用者将看不到这些更改。因此,如果您希望更改传播到函数外部,则必须传递指针。这样,指针将被复制,但它指向的对象将被共享。

另请参阅:关于指针的游览部分、关于指针的 go 规范部分,转到地址运算符的规范部分

卓越飞翔博客
上一篇: X 没有实现 Y(...方法有一个指针接收器)
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏