Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann festgestellt werden, ob ein als Funktionsargument übergebener Zeiger geändert wird oder ob die Kopie geändert wird?

Wie kann festgestellt werden, ob ein als Funktionsargument übergebener Zeiger geändert wird oder ob die Kopie geändert wird?

WBOY
WBOYnach vorne
2024-02-06 10:15:11988Durchsuche

Wie kann festgestellt werden, ob ein als Funktionsargument übergebener Zeiger geändert wird oder ob die Kopie geändert wird?

Frageninhalt

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?

initialfinal的函数参数都指向pmain中的内存地址; initial 能够更改 p,而 finalkann nicht.

Jede Erklärung, warum das passiert, wäre sehr dankbar.


Richtige Antwort


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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen