Можно ли оставлять канал открытым? - PullRequest
125 голосов
/ 21 декабря 2011

Можно ли оставлять канал Go открытым всегда (никогда не закрывать канал), если я никогда не проверю его состояние? Приведет ли это к утечкам памяти? Следующий код в порядке?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}

Ответы [ 4 ]

182 голосов
/ 21 декабря 2011

Можно оставить канал Go открытым навсегда и никогда не закрывать его.Когда канал больше не используется, он будет собирать мусор.

Обратите внимание, что необходимо только закрыть канал, если приемник ищет закрытие.Закрытие канала является управляющим сигналом на канале, указывающим, что больше нет данных.

Вопрос о дизайне: закрытие канала

23 голосов
/ 14 апреля 2016

Да, нормально держать канал открытым.Как указано в языке программирования go книга:

Вам не нужно закрывать каждый канал, когда вы закончили с ним. Необходимо закрывать канал только тогда, когда важно сообщить принимающим процедурам, что все данные отправлены. Канал, который сборщик мусора считает недоступным, получит свои ресурсы, независимо от того, закрыт он или нет.,(Не путайте это с операцией закрытия для открытых файлов. Важно вызывать метод Закрыть для каждого файла, когда вы закончили с ним.)

5 голосов
/ 21 декабря 2011

Да, нормально оставлять канал открытым, и на самом деле это типично.Открываемый канал не является ссылкой на объект канала и не препятствует его сборке.

0 голосов
/ 21 декабря 2011

Go - это сборщик мусора, поэтому вам не нужно ничего «освобождать».

Есть возможность закрыть каналы, но в основном это используется как - close (channel) - как сообщить goroutine (илиОсновная программа), что больше ничего не будет отправлено на этом канале.

...