상태를 확인하지 않으면 Go 채널을 계속 열어 두어야합니다 (채널을 닫지 마십시오)? 메모리 누수가 발생합니까? 다음 코드는 괜찮습니까?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
답변
Go 채널을 영원히 열어두고 닫지 않는 것이 좋습니다. 채널이 더 이상 사용되지 않으면 가비지 수집됩니다.
수신기가 클로즈를 찾고있는 경우에만 채널을 닫아야합니다. 채널을 닫는 것은 더 이상 데이터가 뒤 따르지 않음을 나타내는 채널의 제어 신호입니다.
답변
예, 채널을 열어 두는 것이 좋습니다. 으로 이동 프로그래밍 언어 책은 말했다 :
작업이 끝나면 모든 채널을 닫을 필요는 없습니다. 수신 고 루틴에게 모든 데이터가 전송되었음을 알리는 것이 중요 할 때만 채널을 닫으면됩니다. 가비지 수집기가 도달 할 수 없다고 결정한 채널은 닫혔는지 여부에 관계없이 자원을 회수합니다. (이것은 열린 파일에 대한 닫기 작업과 혼동하지 마십시오. 작업 이 끝나면 모든 파일 에서 Close 메서드 를 호출하는 것이 중요
합니다.)
답변
예, 채널을 열어 두는 것이 좋습니다. 실제로는 일반적입니다. 열려있는 채널은 채널 객체에 대한 참조를 구성하지 않으므로 가비지 수집되지 않습니다.
답변
” Go 채널을 사용하는 일반적인 원칙 중 하나는 수신자 측에서 채널을 닫지 않고 채널에 동시 발신자가 여러 개인 경우 채널을 닫지 않는 것입니다. “
위의 답변에서 명확하게 언급했듯이 모든 채널은 일단 정리 표시가 된 후에는 결국 GC가 될 것이므로 채널을 닫지 않은 채로 두는 것이 유일한 차이점은 채널이 gc
몇 사이클 후에도 가능할 것이라는 것입니다 명시 적으로 닫히지 않았습니다.
또한 다음 기사 this 과 this 는 1 : N, N : 1 또는 M : N (발신자 : 수신자)의 경우 채널을 닫는 다양한 방법을 보여줍니다
답변
Go는 가비지 수집이므로 실제로 아무것도 ‘무료’할 필요는 없습니다.
채널을 닫을 가능성이 있지만 대부분 close-channel로 사용됩니다. 해당 채널에서 다른 어떤 것도 전송되지 않는다고 고 루틴 (또는 메인 프로그램)에 알려주십시오.
답변
