Heim  >  Artikel  >  Backend-Entwicklung  >  Die Übergabe des Zeigers an die Go-Defer-Funktion funktioniert nicht

Die Übergabe des Zeigers an die Go-Defer-Funktion funktioniert nicht

WBOY
WBOYnach vorne
2024-02-13 12:24:09611Durchsuche

将指针传递给 go defer 函数不起作用

Bei der PHP-Programmierung funktioniert der Zeiger möglicherweise nicht, wenn er an die Go-Defer-Funktion übergeben wird. Zeiger werden in PHP verwendet, um die Speicheradresse von Variablen zu speichern. Durch Übergabe des Zeigers kann der Wert der ursprünglichen Variablen innerhalb der Funktion geändert werden. Bei der Übergabe eines Zeigers an eine Go-Defer-Funktion kommt es jedoch manchmal vor, dass die ursprüngliche Variable nicht geändert werden kann. Dies kann daran liegen, dass die Go-Defer-Funktion bei der Ausführung eine neue Goroutine erstellt und der Zeiger möglicherweise auf einen anderen Speicherbereich zeigt, was dazu führt, dass der Wert der Variablen nicht korrekt geändert werden kann. Daher sollten bei der PHP-Programmierung Zeiger an Go-Defer-Funktionen mit Vorsicht übergeben werden, um unerwartete Probleme zu vermeiden.

Frageninhalt

In meinem Code versuche ich, numaddr zu verwenden, um die Änderung der Nummer nach der Defer-Anweisung aufzuzeichnen

func deferrun() {
    num := 1
    numaddr := &num
    defer fmt.printf("num is %d", *numaddr)
    num = 2
    return
}

func main() {
    deferrun()
}

Aber ich bekomme den Wert von num 是 1 而不是 2,为什么 defer 函数使用 *numaddr statt der Adresse?

Dann werde ich eine andere Methode ausprobieren

func deferRun() {
    num := 1
    numAddr := &num
    defer func(intAddr *int){
        fmt.Printf("num is %d", *numAddr)
    }(numAddr)
    
    num = 2
    fmt.Println("num is", *numAddr)
    return
}

func main() {
    deferRun()
}

Dieses Mal funktioniert es, ich bekomme num 是 2,所以我想也许 defer fmt.printf(something) Die Zeichenfolge wird sofort gespeichert, wenn sie deklariert wird, und numaddr wird nicht verwendet, wenn die Defer-Funktion tatsächlich ausgeführt wird?

Lösung

Interessante Frage. Um diese Frage zu beantworten, müssen Sie eine Regel kennen, wie dieses Go-Tutorial https://go.dev/tour/flowcontrol/12

延迟调用的参数会立即计算,但直到周围函数返回时才会执行函数调用。.

Beispiel 1: Sagen Sie der Defer-Funktion, dass sie den Wert drucken soll, der sich an der angegebenen Speicheradresse befindet.

func deferrun() {
    num := 1
    numaddr := &num //address of variable num in stack memory, 0xc000076f38 for example
    defer func(intaddr *int){
        fmt.printf("num is %d", *numaddr)
    }(numaddr) //hey go, when the surrounding function returns, print the value located in this address (numaddr=0xc000076f38)
    num = 2 //now the value located in address 0xc000076f38 is 2
    return  
}

Die Ausgabe wird 2 sein.

Beispiel 2: Sagen Sie der Defer-Funktion, dass sie den angegebenen Wert drucken soll.

func deferRun() {
    num := 1
    numAddr := &num //address of variable num in stack memory, 0xc000076f38 for example
    defer fmt.Printf("num is %d", *numAddr) //Hey Go, when the surrounding function returns, print the this value *numAddr (*numAddr is 1 for now)
    num = 2 //Now the value located in address 0xc000076f38 is 2 but you told the defer function to print 1 before
    return  
}

Die Ausgabe ist 1.

Das obige ist der detaillierte Inhalt vonDie Übergabe des Zeigers an die Go-Defer-Funktion funktioniert nicht. 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