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

2024年 2月 13日 36.5k 0

在 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 规范部分,转到地址运算符的规范部分

以上就是在 Go to 函数中通过引用和值传递的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论