Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich in Golang nicht die Adresse der Funktion abrufen, aber den Funktionswert?

Warum kann ich in Golang nicht die Adresse der Funktion abrufen, aber den Funktionswert?

WBOY
WBOYnach vorne
2024-02-10 19:30:20750Durchsuche

为什么我不能获取 golang 中函数的地址,但可以获取函数值

PHP-Editor Zimo wird für Sie antworten: Warum kann ich in Golang nicht die Adresse der Funktion, aber den Funktionswert erhalten? In Golang können Funktionswerte abgerufen werden, da Funktionswerte ein Typ sind, der aufgerufen werden kann. Die Adresse der Funktion ist nicht erhältlich, was durch Golangs Designentscheidung bestimmt wird. Funktionen in Golang sind erstklassige Bürger und können wie andere Typen zugewiesen, übergeben und aufgerufen werden. Daher können Funktionswerte abgerufen und an andere Funktionen übergeben werden. Die Funktionsimplementierung von Golang wird jedoch durch Schließungen implementiert. Jedes Mal, wenn eine Funktion erstellt wird, wird eine neue Schließungsinstanz generiert, sodass die Adresse der Funktion nicht festgelegt ist und nicht abgerufen werden kann. Ein solches Design kann die Unabhängigkeit und Sicherheit von Funktionen gewährleisten und gleichzeitig den Prozess der Speicherverwaltung und Speicherbereinigung vereinfachen. Obwohl Sie also nicht die Adresse der Funktion erhalten können, können Sie den Funktionswert erhalten und ihn aufrufen.

Inhalt der Frage

Angenommen, ich deklariere eine Funktion in golang:

func myfunc() {     
    }

Es ist ein Fehler, einen Funktionszeiger mithilfe einer Funktionsadresse zu deklarieren

fp := &myfunc

„Ungültiger Vorgang: Adresse von myfunc (Wert vom Typ func()) konnte nicht abgerufen werden“

Allerdings kann ich es einem Funktionswert zuweisen und die Adresse erhalten

functionValue := myFunc
fp := &function

Unterscheidet sich „functionvalue“ von der Verwendung des Funktionsnamens „myfunc“? Sind das nicht beide vom gleichen Typ? (Function())

Solution

myfunc 是一个函数。 functionvalue ist eine Funktionsvariable, bei der es sich um eine Variable handelt, die auf eine Funktion zeigt, und auch auf einen Abschluss. Zum Beispiel:

var x int
functionValue:=func() int {return x}

Oben ein Zitat von functionvalue 是一个函数变量,其闭包包含对 x.

Wenn

wie myfunc 这样的命名函数没有与之关联的闭包。像 functionvalue 这样的函数变量有一个闭包。当您将其分配给 myfunc aussieht, ist der Verschluss leer. Wenn Sie es wie oben zuweisen, ist es ungleich Null. Daher unterscheidet sich der Mechanismus zum Aufrufen einer Funktion vom Aufruf einer Funktionsvariablen.

Die Adresse einer Funktionsvariablen ist die Adresse der Variablen.

Das obige ist der detaillierte Inhalt vonWarum kann ich in Golang nicht die Adresse der Funktion abrufen, aber den Funktionswert?. 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