Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-02-06 10:15:11
nach vorne
1052 Leute haben es durchsucht

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}
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage