NB: To nie jest duplikat pytania o numer this, ponieważ rozumiem, kiedy używasz kanałów jednokierunkowych. Robię to cały czas. Moje pytanie brzmi, dlaczego ten program jest ważny:Czy jest jakiś cel "zrobienia" kanału jednokierunkowego?
func main() {
ch := make(chan<- int)
ch <- 5
fmt.Println("Hello, playground")
}
Running to, oczywiście, daje impasu. Jeśli zaznaczysz typ za pomocą% T, Go faktycznie zgłasza, że typ ch
jest kanałem tylko do wysyłania. W Go możesz uzyskać jednokierunkowe kanały make
, ale nie ma to większego sensu, ponieważ tworząc kanał, który w momencie jego powstania jest tylko w jedną stronę, zapewnia, że co najmniej jeden z odczytów/zapisów nigdy nie powstanie.
Możliwe wytłumaczenie polegałoby na zmuszeniu goryla do zawieszenia, ale równie łatwo można to osiągnąć dzięki select {}
.
Moja jedynym pomysłem jest aby wymusić goroutine tylko coś zrobić n
razy
ch := make(chan<- int, 50)
// do something 50 times, since then the buffer is full
for {
ch <- doSomething()
}
Ale to łatwiej, nie wspominając o mniej złudzenia, realizowany z dowolną liczbą różnych konstrukcji.
Czy jest to tylko dziwactwo/niedopatrzenie systemu typu, czy też jest użycie tego zachowania, o którym nie myślę?
wierzę jeden z celów projektowych Go jest prostota. Specyfikacja języka jest bardzo krótka. Wierzę, że może to być przykład prostoty kosztem nonsensownych konstrukcji. – ReyCharles
@ReyCharles Chciałbym zaakceptować, że dla, powiedzmy, 'var chan <- int = make (chan int)' jest ważny, ale 'make' jest tak specjalny konstrukt, którego zachowanie jest dość wyraźnie i wyczerpująco określone w specyfikacji uważam, że jest to raczej niedopatrzenie niż konsekwencja prostoty. – LinearZoetrope
Myślę, że jest to rzecz, której nigdy nie chciałbyś robić. (A przynajmniej ktoś, kto wymyślił dla niego zastosowanie, wygrywa dzisiejszą rundę Go Pub Trivia ™.) Ale zgodnie z tym, co powiedział @ReyCharles, specyfikacje nie są wymagane, aby wykluczyć wszystkie nonsensowne konstrukty. Idźmy do prób zapobiegania niektórym formom nonsensu, których C nie ma (np. Niewykorzystane vary); Rust ma kontrole statyczne, które próbują wykluczyć pewne bzdury Idź radośnie kompiluje (np. Wyścigi). To jest w porządku, a my zwykle chichoczymy na sporadyczne dziwactwa i przechodzimy do próbowania budowania rzeczy. – twotwotwo