1

übergeben Ich versuche, ein sehr einfaches Programm zu erstellen, das Arrays ändert, aber einige interessante Verhaltensweisen durchlief, wenn ich sie in Typen umwandelte. https://play.golang.org/p/KC7mqmHuLw Es scheint, dass, wenn ich ein Array habe, go by references geht, aber wenn ich einen Typ habe, dann geht go passes by value. Ist das richtig?Bitte erläutern Sie, ob die Golang-Typen den Wert

Ich habe zwei Variablen b und c, beide sind Arrays von 3 ganzen Zahlen, aber c ist vom Typ cT, in jeder anderen Hinsicht sollten sie identisch sein. Ich kann Werte wie b[0]=-1 und c[0]=-1 zuweisen, aber wenn ich diese Arrays als Parameter an eine Funktion übergebe, verhalten sie sich sehr unterschiedlich.

Die Ausgabe des Programms ist:

vor B: [1 2 3]

vor C: [1 2 3]

* nach b: [-1 2 0

]

* nach c: [-1 2 3]

* was? c: [-1 2 0]

Meine ursprüngliche Annahme ist, dass die Zeilen "nach b" und "nach c" gleich sein sollten. Tue ich etwas falsch oder bin ich korrekt über Typen, die nach Wert an Funktionen übergeben werden (zB. Erstellen einer Kopie der Variablen vor dem Übergang zur Funktion)?

package main 

import "fmt" 

type cT [3]int 

func main() { 
    b := []int{1, 2, 3} 
    c := cT{1, 2, 3} 

    fmt.Println("before b:", b) 
    fmt.Println("before c:", c) 

    b[0] = -1 
    c[0] = -1 
    mangleB(b) // ignore return value 
    mangleC(c) // ignore return value 

    fmt.Println("*after b:", b) 
    fmt.Println("*after c:", c) 

    c = mangleC(c)  
    fmt.Println("*what? c:", c)  
} 

func mangleB(row []int) []int { 
    row[2] = 0 
    return row 
} 

func mangleC(row cT) cT{ 
    row[2] = 0 
    return row 
} 
+0

OK, danke für die Hilfe zu vereinfachen! Mit den bereitgestellten Informationen bekomme ich den gewünschten Effekt, indem ich einen Verweis auf den Typ 'manglePC (& c)' übergebe und die Funktion in 'func manglePC (row * cT) { \t (* row) [2] = 0 } ' – SammyO

Antwort

2

The Go Programming Language Specification

Array types

ein Array mit einer Folge von Elementen einer einzigen Art nummeriert ist, genannt der Elementtyp.

Slice types

Eine Scheibe ist ein Deskriptor für einen zusammenhängenden Abschnitt eines darunterliegenden Array und ermöglicht den Zugriff auf eine nummerierte Folge von Elementen aus dieser Array.

Calls

In einem Funktionsaufruf werden die Funktionswert und Argumente in die übliche Reihenfolge ausgewertet. Nach der Auswertung werden die Parameter des Aufrufs als Wert an die Funktion übergeben und die aufgerufene Funktion beginnt mit der Ausführung . Die Rückgabe-Parameter der Funktion werden mit dem Wert an die aufrufende Funktion zurückgegeben, wenn die Funktion zurückkehrt.


type cT [3]int 

b := []int{1, 2, 3} 
c := cT{1, 2, 3} 

ich zwei Variablen, b und c sind beide Anordnungen von drei ganzen Zahlen


Nein, du nicht!

b ist ein slice von int mit der Länge (len(b)) 3 und Kapazität (cap(b)) 3, ist ein cArray von (len(c)) 3 int.

In Go werden alle Parameter als Wert übergeben. b wird als Slice-Deskriptor übergeben, c wird als Array übergeben. Ein Slice-Deskriptor ist ein struct mit einer Slice-Länge und Kapazität und einem Zeiger auf das darunter liegende Array.

0

Siehe Anmerkungen:

func main() { 
    b := []int{1, 2, 3} // slice 
    c := cT{1, 2, 3} // array 

    fmt.Println("before b:", b) 
    fmt.Println("before c:", c) 

    b[0] = -1 
    c[0] = -1 

    // passing in a slice which you can think of as ref to array 
    // pass by value, and it is copy of ref to array 
    mangleB(b) // ignore return value 

    // passing in copy of array (pass by value) 
    // yes full shallow copy of array 
    mangleC(c) // ignore return value 
    // if you ignore return modifications are lost 

    fmt.Println("*after b:", b) 
    fmt.Println("*after c:", c) 

    // return value is modified array 
    c = mangleC(c) 
    // c now copy of array from line 24 

    fmt.Println("*what? c:", c) 
} 

https://play.golang.org/p/OAaCMhc-Ug

Verwandte Themen