package main import ( "fmt" ) type Numbers struct { x int y int } func initial(number *Numbers) { number.x = 1 number.y = 1 } func final(number *Numbers) { number = &Numbers{2, 2} } func main() { p := Numbers{0, 0} fmt.Println(p) //Prints {0 0} initial(&p) fmt.Println(p) //Prints {1 1} final(&p) fmt.Println(p) //Expected to print {2, 2} but prints {1, 1} }
Warum ändert die Funktion initial
函数修改指针,而 final
eine Kopie eines Zeigers?
initial
和final
的函数参数都指向p
在main
中的内存地址; initial
能够更改 p
,而 final
kann nicht.
Jede Erklärung, warum das passiert, wäre sehr dankbar.
Um die Daten zu ändern, auf die ein Zeiger zeigt, muss der Zeiger dereferenziert werden. Der Dereferenzierungsoperator ist *
。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1
被转换为 (*number).x = 1
.
Diese implizite Übersetzung kann verwirrend sein, aber Sie sollten beachten, dass der Ausdruck number.x = 1
将毫无意义,因为 number
, wenn keine Übersetzung erfolgt, vom Zeigertyp ist und Zeiger keine Felder haben.
Zusammengefasst: initial
函数具有隐式指针解引用,而 final
nicht.
Wenn du so willst final
更改为显式且正确地取消引用,*number = Numbers{2, 2}
,那么它也会更改 p
.
Das obige ist der detaillierte Inhalt vonWie kann festgestellt werden, ob ein als Funktionsargument übergebener Zeiger geändert wird oder ob die Kopie geändert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!