Nếu một cấu trúc lớn được gửi qua một kênh trong Go, nó có thực sự được sao chép giữa các goroutine không?Cấu trúc có thực sự được sao chép giữa các goroutines nếu được gửi qua kênh Golang không?
Ví dụ: trong mã bên dưới, Go thực sự sẽ sao chép tất cả dữ liệu bigStruct giữa nhà sản xuất và người tiêu dùng 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++
}
}
}
Playground: http://play.golang.org/p/fawEQnSDwB
Cách khác, nếu cấu trúc chứa một slice, '[] int ', hiệu ứng truyền slice (và do đó struct) theo giá trị sẽ không sao chép mảng nội bộ. Tôi không nói đó là câu trả lời của bạn. –