在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 规范部分,转到地址运算符的规范部分
Das obige ist der detaillierte Inhalt vonÜbergabe von Referenz und Wert in der Funktion „Gehe zu'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!