Wenn eine große Struktur über einen Kanal in Go gesendet wird, wird sie tatsächlich zwischen Gououtines kopiert?Wird eine Struktur zwischen Goroutinen kopiert, wenn sie über einen Golang-Kanal gesendet wird?
Zum Beispiel wird Go in dem folgenden Code tatsächlich alle LargeStruct-Daten zwischen Gououtines Producer und Consumer kopieren?
package main
import (
"fmt"
"sync"
)
type largeStruct struct {
buf [10000]int
}
func main() {
ch := make(chan largeStruct)
wg := &sync.WaitGroup{}
wg.Add(2)
go consumer(wg, ch)
go producer(wg, ch)
wg.Wait()
}
func producer(wg *sync.WaitGroup, output chan<- largeStruct) {
defer wg.Done()
for i := 0; i < 5; i++ {
fmt.Printf("producer: %d\n", i)
output <- largeStruct{}
}
close(output)
}
func consumer(wg *sync.WaitGroup, input <-chan largeStruct) {
defer wg.Done()
i := 0
LOOP:
for {
select {
case _, ok := <-input:
if !ok {
break LOOP
}
fmt.Printf("consumer: %d\n", i)
i++
}
}
}
Spielplatz: http://play.golang.org/p/fawEQnSDwB
Alternativ, wenn die Struktur eine Scheibe enthielt, '[] int ', würde der Effekt der Übergabe der Scheibe (und damit der Struktur) nach Wert das interne Array nicht kopieren. Ich sage nicht, dass das deine Antwort ist. –