Есть ли цель "сделать" однонаправленный канал?
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 {
}
}