在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 函数中通过引用和值传递的详细内容,更多请关注编程网其它相关文章!