Tại sao lại hoảng sợ khi ghi vào kênh đã đóng?Tại sao lại hoảng sợ khi viết thư cho một kênh đã đóng?
Trong khi người ta có thể sử dụng value, ok := <-channel
thành ngữ để đọc từ các kênh, và do đó kết quả ok có thể được kiểm tra đánh một kênh đóng:
// reading from closed channel
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 2
close(ch)
read(ch)
read(ch)
read(ch)
}
func read(ch <-chan int) {
i,ok := <- ch
if !ok {
fmt.Printf("channel is closed\n")
return
}
fmt.Printf("read %d from channel\n", i)
}
Output:
read 2 from channel
channel is closed
channel is closed
Run "đọc từ kênh đã đóng "trên Playground
Việc ghi vào kênh có thể bị đóng là phức tạp hơn, vì Go sẽ hoảng sợ nếu bạn chỉ cố gắng wri te khi kênh được đóng lại:
//writing to closed channel
package main
import (
"fmt"
)
func main() {
output := make(chan int, 1) // create channel
write(output, 2)
close(output) // close channel
write(output, 3)
write(output, 4)
}
// how to write on possibly closed channel
func write(out chan int, i int) (err error) {
defer func() {
// recover from panic caused by writing to a closed channel
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
fmt.Printf("write: error writing %d on channel: %v\n", i, err)
return
}
fmt.Printf("write: wrote %d on channel\n", i)
}()
out <- i // write on possibly closed channel
return err
}
Output:
write: wrote 2 on channel
write: error writing 3 on channel: send on closed channel
write: error writing 4 on channel: send on closed channel
Run "bằng văn bản cho kênh kín" trên Playground
Theo như tôi biết, có không phải là một thành ngữ đơn giản để viết vào một kênh có thể đóng mà không cần phải hoảng sợ. Tại sao không? Lý do đằng sau hành vi bất đối xứng như thế nào giữa đọc và viết?
Làm sao chúng ta biết được? Hỏi về nhóm google golang, có thể một trong các tác giả sẽ trả lời bạn. Tôi có thể nghĩ ra một lý do. Nó chỉ là một thiết kế tốt để đóng một kênh ở phía nhà sản xuất. Panicking buộc bạn phải thiết kế ứng dụng của bạn theo cách như vậy. – creker
Đóng kênh là tín hiệu cho thấy ở đây sẽ không còn giá trị nào nữa. Việc ghi vào một kênh đã đóng là lỗi chương trình, điều này gây hoảng loạn. – JimB