2015-07-06 13 views
14

NB: Đây không phải là bản sao của câu hỏi this, bởi vì tôi hiểu khi nào bạn sẽ sử dụng các kênh một chiều. Tôi làm như vậy tất cả các thời gian. Câu hỏi của tôi là lý do tại sao chương trình này là hợp lệ:Có mục đích "tạo" một kênh một chiều không?

func main() { 
    ch := make(chan<- int) 
    ch <- 5 
    fmt.Println("Hello, playground") 
} 

Playground

Chạy nó, tất nhiên, cung cấp cho một bế tắc. Nếu bạn kiểm tra loại với% T, Go thực tế báo cáo rằng loại ch là kênh chỉ gửi. Trong Go, bạn được phép make các kênh đơn hướng, nhưng điều này có ý nghĩa ít bởi vì bằng cách tạo kênh tại thời điểm khởi đầu chỉ có một chiều, bạn đảm bảo ít nhất một lần đọc/ghi sẽ không bao giờ xảy ra.

Giải thích có thể là buộc goroutine treo nhưng điều đó cũng dễ dàng thực hiện với select {}.

chỉ ý tưởng khác của tôi là để buộc một goroutine chỉ làm điều gì đó n lần,

ch := make(chan<- int, 50) 
// do something 50 times, since then the buffer is full 
for { 
    ch <- doSomething() 
} 

Nhưng đó là dễ dàng hơn, chưa kể đến ít gây nhầm lẫn, thực hiện với bất kỳ số lượng công trình xây dựng khác nhau.

Đây có phải chỉ là một sự lừa đảo/giám sát của hệ thống kiểu, hoặc có sử dụng cho hành vi này mà tôi không nghĩ tới không?

+1

Tôi tin rằng một trong những mục tiêu thiết kế của Go là sự đơn giản. Thông số ngôn ngữ rất ngắn. Tôi tin rằng đây có thể là một ví dụ về sự đơn giản với chi phí của các cấu trúc vô nghĩa. – ReyCharles

+2

@ReyCharles Tôi sẽ chấp nhận rằng vì lý do tại sao, 'var ch chan <- int = make (chan int)' là hợp lệ, nhưng 'make' là một cấu trúc đặc biệt có hành vi khá rõ ràng và toàn diện được viết trong spec rằng tôi nghĩ rằng đó là một sự giám sát hơn là một hệ quả của sự đơn giản. – LinearZoetrope

+8

Tôi nghĩ đó là điều bạn không bao giờ muốn làm. (Hoặc, ít nhất, một người đi kèm với một sử dụng cho nó thắng vòng hôm nay của Go Pub Trivia ™.) Nhưng theo dòng của những gì @ReyCharles nói, thông số kỹ thuật không được yêu cầu để loại trừ tất cả các cấu trúc vô nghĩa. Cố gắng ngăn chặn một số dạng vô nghĩa mà C không (ví dụ: các hộp không sử dụng); Rust có các kiểm tra tĩnh cố gắng loại trừ một số điều vô nghĩa. Hãy thực hiện các biên dịch vui vẻ (ví dụ: các cuộc đua). Đó là OK, và chúng tôi chủ yếu cười vào sự kỳ quặc thường xuyên và di chuyển trên để cố gắng xây dựng công cụ. – twotwotwo

Trả lời

3

Bạn có ngôn ngữ: từ (mã thông báo) và ngữ pháp. Bạn luôn có thể viết vô nghĩa hợp lệ: màu xanh không phải là màu.

Bạn đã viết một số vô nghĩa hợp lệ:

package main 

func main() { 
    ch := make(chan<- int) 
    ch <- 5 
} 

Dưới đây là một số vô nghĩa có giá trị hơn:

package main 

func main() { 
    for { 
    } 
} 
Các vấn đề liên quan