Go 中的不同通道實作
在Go 中,實作輸出不同值的通道需要一種機制來追蹤先前看到的值。
一種常見的方法是使用地圖資料結構,如答案中所建議的:
func UniqueGen(min, max int) <-chan int { m := make(map[int]struct{}, max-min) ch := make(chan int) go func() { for i := 0; i < 1000; i++ { v := min + rand.Intn(max) if _, ok := m[v]; !ok { ch <- v m[v] = struct{}{} } } close(ch) }() return ch }
此函數產生一個通道,該通道在指定範圍內產生最多1000 個不同的整數。它維護一個映射,其中的鍵代表迄今為止看到的值。如果遇到新值(映射中不存在),則會在通道上傳送該值,並更新映射以記錄其出現。
至於記憶體洩漏問題,請使用映射來實現此目的通常被認為是記憶體高效的。 Go 中的映射引用鍵值,因此記憶體消耗與遇到的不同值的數量保持正比。但是,需要注意的是,映射將繼續保留對先前值的引用,因此,如果不同值的數量變得非常大,它仍然可能會消耗大量記憶體。
以上是如何在 Go 中實現僅輸出不同值的通道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!