Werden Kanäle standardmäßig als Referenz übergeben?
In Go erstellt die integrierte Funktion make Instanzen von Slices, Maps und Kanälen . Diese Typen werden nicht direkt als Referenz übergeben, verhalten sich aber technisch gesehen aufgrund der Speicherzuweisung auf dem Heap während ihrer Initialisierung als solche.
Das folgende Kanalbeispiel veranschaulicht dieses Verhalten:
package main import "fmt" func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum } func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c fmt.Println(x, y, x+y) }
In diesem Beispiel wird der Kanal c mit make initialisiert, wodurch ein referenzähnliches Verhalten entsteht. Alle innerhalb der Summenfunktion an c vorgenommenen Änderungen bleiben bestehen, nachdem die Funktion beendet wurde.
Dieses Verhalten wird in der Go-Spezifikation näher erläutert:
Die integrierte Funktion make benötigt einen Typ T, der muss ein Slice-, Map- oder Channel-Typ sein, optional gefolgt von einer typspezifischen Liste von Ausdrücken. Es gibt einen Wert vom Typ T (nicht *T) zurück. Die Initialisierung des Speichers erfolgt wie im Abschnitt „Initial“ beschrieben Werte上是按值传递的.这使得它们可以传递给函数并允许写入或读取,类似于指针的行为.
Das obige ist der detaillierte Inhalt vonWerden Kanäle in Go als Wert oder Referenz übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!