Golang: Das Geheimnis des Array-Passings lüften
In diesem Artikel befassen wir uns mit dem Rätsel rund um das Array-Passing in Golang. Im Gegensatz zu einigen anderen Sprachen, in denen Arrays implizit als Referenz übergeben werden, ist Golangs Ansatz einzigartig.
Exploring the Confusion
Alan A.A. Donovan und Brian W. Kernighan schlagen in „The Go Programming Language“ vor, dass Arrays in Go nicht implizit als Referenz übergeben werden. Eine genaue Untersuchung des folgenden Codes kann jedoch Fragen aufwerfen:
<code class="go">func main() { tab := []int{1, 2, 3} fmt.Println(tab) // Results in [1 2 3] reverse(tab) fmt.Println(tab) // Results in [3 2 1] } func reverse(tab []int) { for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 { tab[i], tab[j] = tab[j], tab[i] } }</code>
Obwohl das Array nicht als Referenz übergeben wird, ändert die Umkehrfunktion das ursprüngliche Array. Dieses Verhalten scheint C ähnlich zu sein.
The Truth Revealed
Der Schlüssel liegt darin, zu erkennen, dass die Registerkarte „Variablen“ (in der Hauptansicht) und die Registerkarte „Parameter“ (in umgekehrter Reihenfolge) vorhanden sind keine Arrays, sondern Slices eines zugrunde liegenden Arrays. Im Gegensatz zu Arrays sind Slices lediglich Header, die einen Teil eines Arrays beschreiben. Wenn Slices weitergegeben werden, werden nur diese Header kopiert und verweisen auf dasselbe Backing-Array.
Wesentliche Unterscheidungen
In Go sind Array-Längen ihrem Typ inhärent ( z. B. [3]int), was angibt, dass tatsächliche Arrays als Wert übergeben werden. Slices hingegen sind reine Deskriptoren und werden als Wert übergeben, aber Änderungen an ihren Elementen wirken sich auf das zugrunde liegende Array aus, da es für alle Slices gleich ist.
Zusätzliche Erkenntnisse
Für ein tieferes Verständnis lesen Sie die folgenden Ressourcen:
Fazit
Gos Ansatz zur Übergabe von Arrays ist unterscheidet sich von einigen anderen Sprachen. Um dieses Verhalten zu verstehen, ist es wichtig, den Unterschied zwischen Arrays und Slices zu verstehen. Slices dienen als flexible Header und ermöglichen die Änderung des zugrunde liegenden Arrays durch verschiedene Slice-Kopien.
Das obige ist der detaillierte Inhalt vonGo: Werden Arrays als Referenz oder Wert übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!