2017-03-06 4 views
-1

Ich möchte dieses Verhalten in Golang, erläutern, warum, wenn Sie die Speicherreferenz auf Array nehmen und Werte von dieser Referenz ändern Sie nichts in der referenzierenden Array ändern.Golang Array Pointer

Ein Beispiel:

var t [5]int 
printType(t,"t") 
p := &t 
printType(p,"p") 
x := *p 
x[0] = 4 
printType(x,"x") 
printType(p,"p") 
printType(t,"t") 

Dieser Code Rückkehr

[t] Type:[5]int Kind:array Adr:%!p([5]int=[0 0 0 0 0]) Value:([0 0 0 0 0]) 
[p] Type:*[5]int Kind:ptr Adr:0xc4200142d0 Value:(&[0 0 0 0 0]) 
[x] Type:[5]int Kind:array Adr:%!p([5]int=[4 0 0 0 0]) Value:([4 0 0 0 0]) 
[p] Type:*[5]int Kind:ptr Adr:0xc4200142d0 Value:(&[0 0 0 0 0]) 
[t] Type:[5]int Kind:array Adr:%!p([5]int=[0 0 0 0 0]) Value:([0 0 0 0 0]) 

können Sie die Speicheradresse sehen ist die gleiche, aber der Wert "4" ist nicht vorhanden.

Methode Printtype

func printType(i interface {},message string) { 
    k := reflect.TypeOf(i).Kind().String() 
    fmt.Printf("[%s] Type:%T Kind:%s Adr:%[2]p Value:(%[2]v)\n",message,i,k) 
} 

Antwort

-1

Ordnung fand es, der Operator ": =" eine neue Speicheradresse zuordnet.

1

Okay, es gefunden, der Operator ": =" eine neue Speicheradresse zuweisen.

Nein, es wird nichts zugewiesen.

var t [5]int ist ein Wert. Beachten Sie, dass laut Spezifikation [5]int in diesem Fall der vollständige Typname angegeben wird. Sie können es sich von einer Struktur mit 5 int Feldern vorstellen. Zeile x := *p macht Dereferenzierung Zeiger auf die t (ein Wert). Die Zuweisung eines Werts erstellt eine Kopie davon. Wenn Sie eine "Referenz" an t übergeben wollen, machen Sie ein Stück davon: t[:].