Sobes.tech
Back to questions
Middle+
2

Как синтаксически запретить читателю закрыть канал?

Companies where asked
Magnit Tech

Answer from AI

sobes.tech AI

В Go нельзя напрямую запретить закрывать канал, так как оператор close работает с каналом, а не с его типом. Но можно синтаксически ограничить доступ к закрытию канала, если передавать канал только для чтения (receive-only) в те части кода, где закрывать его не нужно.

Канал в Go имеет три основных типа:

  • chan T — двунаправленный канал (чтение и запись)
  • <-chan T — канал только для чтения
  • chan<- T — канал только для записи

Закрывать канал может только владелец, который имеет двунаправленный канал (chan T). Если функция принимает <-chan T, то она не может закрыть канал, так как оператор close требует chan T.

Пример:

func producer(ch chan<- int) {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    // Закрывать канал может только владелец с chan T
}

func consumer(ch <-chan int) {
    for v := range ch {
        fmt.Println(v)
    }
    // Здесь нельзя вызвать close(ch), так как ch - только для чтения
}

func main() {
    ch := make(chan int)
    go producer(ch)
    consumer(ch)
}

Таким образом, чтобы запретить читателю закрывать канал, передавайте ему канал как <-chan T. Только владелец с chan T может закрыть канал.