Есть ли цель "сделать" однонаправленный канал?

NB: Это не дубликат этого вопроса, потому что я понимаю, когда вы будете использовать однонаправленные каналы. Я делаю это все время. Мой вопрос в том, почему эта программа действительна:

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

Игровая площадка

Запуск, конечно, дает тупик. Если вы проверите тип с% T, Go действительно сообщит, что тип ch является каналом только для отправки. В Go вам разрешено использовать однонаправленные каналы make, но это имеет мало смысла, потому что, создавая канал, который на момент его создания является односторонним, вы гарантируете, что хотя бы одно из чтения/записи никогда не произойдет.

Возможное объяснение заключается в том, чтобы заставить goroutine висеть, но это так же легко достигается с помощью select {}.

Моя единственная другая идея - заставить goroutine делать что-то n раз,

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

Но это легче, не говоря уже о том, что смутно, с любым количеством различных конструкций.

Является ли это просто причудой/надзором системы типов или используется для такого поведения, о котором я не думаю?

Ответы

Ответ 1

У вас есть язык: слова (токены) и грамматика. Вы всегда можете написать действительную глупость: синий цвет не цвет.

Вы написали какую-то действительную чепуху:

package main

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

Вот еще более правдоподобная глупость:

package main

func main() {
    for {
    }
}