提供的程式碼示範了使用通道模擬 Python 風格的遞歸產生器函數。
按照慣例,Go 中的生成器可以使用以下方式實現goroutine 和通道如下:
通常,產生器函數應該負責關閉通道。這可以確保當生成器完成發送所有值時關閉通道。
修改後的程式碼可以慣用地寫成如下:
庫
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中文網其他相關文章!