ü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
}
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