Warum wird der Inhalt des Slice in GO nicht geändert?


Kind :

Ich dachte, dass in der GO-Sprache Slices als Referenz übergeben werden. Aber warum ändert der folgende Code den Inhalt von Slice c nicht? Vermisse ich etwas Danke dir.

package main

import (
    "fmt"
)


func call(c []int) {
    c = append(c, 1)
    fmt.Println(c)
}

func main() {
    c := make([]int, 1, 5)
    fmt.Println(c)
    call(c)
    fmt.Println(c)
}

Das gedruckte Ergebnis ist:

[0] [0 1] [0]

während ich erwartet hatte

[0] [0 1] [0 1]

Stephen Weinberg:

Die Länge des Slice wird im Slice-Header beibehalten, der nicht als Referenz übergeben wird. Sie können sich ein Slice als eine Struktur vorstellen, die einen Zeiger auf das Array, eine Länge und eine Kapazität enthält.

Wenn Sie an das Slice angehängt haben, haben Sie den Index 1 im Datenarray geändert und dann die Länge im Slice-Header erhöht. Bei Ihrer Rückkehr hatte cdie Hauptfunktion eine Länge von 1 und druckte so die gleichen Daten.

Der Grund, warum Slices auf diese Weise funktionieren, besteht darin, dass mehrere Slices auf dieselben Daten verweisen können. Beispielsweise:

x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]

Alle drei dieser Slices zeigen auf überlappende Daten im selben zugrunde liegenden Array.

Verwandte Artikel


Warum wird der Inhalt des Etiketts nicht angezeigt?

EIN ICH Ich habe also eine Ansicht mit einem Etikett und ein ViewModel dafür. ViewModelBase public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void RaisePropertyCh

Warum wird die Variable nach der Änderung nicht geändert?

EIN V Ich habe Pagination-Klasse: export class Pagination { public localPagination(type: IPaginationLocal): void { this.paginationType = type; this.fetchData(); } public fetchData() { this.paginationType.data = this.paginationType.dat

Warum wird der Beschriftungstext nicht sofort geändert?

Kerben Ich habe versucht, die Geschwindigkeit von zu testen ModernHttpClient, als ich auf Folgendes stieß: Das Etikett wird nicht aktualisiert und die Schaltfläche wird im folgenden Code (getestet auf Nexus 5x) nicht sofort deaktiviert, sondern wartet darauf,

Referenzzuweisung in Python - Warum wird der Wert nicht geändert?

Echo Lee Ich weiß, dass "Variablenzuweisung" in Python tatsächlich eine Bindung / erneute Bindung eines Namens (der Variablen) an ein Objekt ist. b = [1,2,3] a = b[2] # binding a to b[2] ? a = 1000 b ist [1, 2, 3] Warum wird b nach dieser Änderung nicht geänd

Warum wird mit Punktoperator der Wert in c ++ nicht geändert?

user858582 Ich komme aus dem Javascript-Hintergrund und habe mit C ++ experimentiert, wo ich ein Strukturelement in einem Array in der Aufruferfunktion wie folgt mutieren wollte. #include<iostream> #include<vector> using namespace std; typedef struct Node{

Warum wird der Hintergrund nicht in ein Bild in CSS geändert?

Dom Stanley Ich habe diesen Code in CSS geschrieben 'body { background-image: url('C:\Users\HerOx\Desktop\Programming Projects\conquering cat\olivia images\olivia-demon.png'); }' Und es funktioniert nicht. Tabogachi Eine Lösung dafür wäre, das Bild einfach in