यदि गो में एक चैनल पर एक बड़ी संरचना भेजी जाती है, तो क्या यह वास्तव में गोरोटाइन के बीच कॉपी की जाती है?क्या गोलांग चैनल पर भेजे जाने पर वास्तव में गोरोटाइन के बीच एक संरचना की प्रतिलिपि बनाई गई है?
उदाहरण के लिए, नीचे दिए गए कोड में, वास्तव में goroutines निर्माता और उपभोक्ता के बीच सभी बड़े संरचना डेटा कॉपी करेंगे?
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++
}
}
}
खेल का मैदान: http://play.golang.org/p/fawEQnSDwB
वैकल्पिक रूप से, यदि संरचना में एक टुकड़ा होता है, '[] int', स्लाइस (और इसलिए संरचना) को पास करने का प्रभाव आंतरिक सरणी की प्रतिलिपि नहीं करेगा। मैं यह नहीं कह रहा हूं कि आपका जवाब हालांकि है। –