Heim >Backend-Entwicklung >Golang >Go: Werden Arrays als Referenz oder Wert übergeben?

Go: Werden Arrays als Referenz oder Wert übergeben?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 04:17:02453Durchsuche

Go: Do Arrays Pass by Reference or Value?

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:

  • Go Slices: Verwendung und Interna
  • Arrays, Slices (und Strings): Die Mechanik des „Anhängens“
  • Warum gibt es Arrays in Go?
  • Werden Go-Slices nach Wert übergeben?

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!

Stellungnahme:
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