제공된 코드는 Python 스타일 수율을 시뮬레이션하기 위해 채널을 사용하는 재귀 생성기 함수를 보여줍니다.
관용적으로 Go의 생성기는 다음을 사용하여 구현할 수 있습니다. 고루틴과 채널은 다음과 같습니다.
관용적으로 생성기 기능은 채널 닫기를 담당해야 합니다. 이렇게 하면 생성기가 모든 값 전송을 완료할 때 채널이 닫히게 됩니다.
수정된 코드는 다음과 같이 관용적으로 작성할 수 있습니다. 다음:
라이브러리
func permutateWithChannel(channel chan<- []string, strings, prefix []string) { defer close(channel) length := len(strings) if length == 0 { channel <- prefix return } newStrings := make([]string, 0, length-1) for i, s := range strings { newStringsI := append(newStrings, strings[:i]...) newStringsI = append(newStringsI, strings[i+1:]...) newPrefixI := append(prefix, s) go permutateWithChannel(channel, newStringsI, newPrefixI) } } func PermutateWithChannel(strings []string) chan []string { channel := make(chan []string) prefix := make([]string, 0, len(strings)) go permutateWithChannel(channel, strings, prefix) return channel }
발신자
func main() { channel := lib.PermutateWithChannel(fruits) for myFruits := range channel { fmt.Println(myFruits) if myFruits[0] == banned { return } } }
소비자가 닫힌 후에 채널을 닫아도 패닉이 발생하지 않습니다. 실제로 닫힌 채널에 값을 보내려고 하면 닫힌 채널 오류가 발생합니다.
라이브러리 기능을 수신 전용으로 제한하려면 관용적인 접근 방식을 사용하세요. 값을 수신하고 신호를 보내는 데 별도의 채널 유형을 사용하는 것입니다. 이 경우 라이브러리 함수에는 다음과 같은 서명이 있습니다.
func PermutateWithChannel(strings []string) (<-chan []string, chan<- struct{})
위 내용은 채널을 사용하여 Go에서 재귀 생성기를 관용적으로 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!