Go Tour의 등가 이진 트리
이 연습에는 두 이진 트리가 동일한 값을 포함하는지 확인하는 작업이 포함됩니다. 구현 시에는 고루틴을 올바르게 사용하여 두 트리를 동시에 탐색하고 해당 값을 채널에 보냅니다. 그러나 트리에 더 이상 요소가 남아 있지 않다는 신호를 보내려고 할 때 문제가 발생합니다.
조기 폐쇄 방지
Walk에서 close(ch)를 사용하면 조기에 종료됩니다. 재귀가 일찍 종료되므로 모든 값이 전송되기 전에 채널을 닫습니다. 대신에 클로저를 사용하는 것이 우아한 솔루션입니다.
func Walk(t *tree.Tree, ch chan int) { defer close(ch) // Closes the channel when this function returns var walk func(t *tree.Tree) walk = func(t *tree.Tree) { if t == nil { return } walk(t.Left) ch <- t.Value walk(t.Right) } walk(t) }
이 클로저는 ch 채널을 캡처하고 더 이상 통과할 노드가 없을 때만 닫히도록 보장합니다. defer close 문은 모든 재귀 호출이 완료된 후 클로저가 실행되도록 보장합니다.
이 수정을 통해 Same 함수는 채널에서 반복적으로 값을 수신하고 비교하여 동등성을 정확하게 결정할 수 있습니다.
위 내용은 고루틴과 채널이 Go에서 두 바이너리 트리의 값을 효율적으로 비교할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!