2015-07-06 11 views
14

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") 
} 

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ę?

+1

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

+2

@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

+8

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

Odpowiedz

3

Masz język: słowa (tokeny) i gramatykę. Zawsze możesz napisać prawidłowy nonsens: niebieski nie jest kolorem.

Napisałeś poprawny nonsens:

package main 

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

Oto niektóre bardziej ważne nonsens:

package main 

func main() { 
    for { 
    } 
}