Xét đoạn mã sau như một ví dụ đơn giản:Bộ thu gom rác sẽ thu thập các thói quen Go sẽ không bao giờ tiếp tục?
func printer(c <-chan int) {
for {
fmt.Print(<-c)
}
}
func provide() {
c := make(chan int)
go printer(c)
for i := 1; i <= 100; i++ {
c <- i
}
}
Chức năng provide
tạo ra một thói quen đi printer
đó in các dữ liệu provide
tạo ra.
Câu hỏi của tôi là, điều gì xảy ra sau khi provide
trả về và printer
bắt đầu chặn trên kênh trống. Việc rò rỉ thông thường có bị rò rỉ, vì không có tham chiếu thêm nào tới c
hoặc bộ thu gom rác sẽ bắt được trường hợp này và vứt bỏ cả thói quen đi và c
?
Nếu thực sự là trường hợp loại mã này gây ra rò rỉ bộ nhớ, tôi có thể làm những chiến lược nào để ngăn chặn sự rò rỉ bộ nhớ đó xảy ra?
Cảm ơn bạn. Rõ ràng "giải pháp" của tôi không thực sự hoạt động tốt. – fuz
sử dụng mệnh đề phạm vi trong goroutine của máy in sẽ tránh kiểm tra ok -> cho v: = phạm vi c {fmt.Println (v)} – Philipp
@Philipp: Đúng, bạn nói đúng. – zzzz