Go 中Python 列表理解的等效項
與Python 等其他語言相比,許多開發人員發現在Go 中執行看似簡單的任務具有挑戰性。其中一項任務是複製 Python 的列表理解語法。
要在 Go 中實現等效的構造,請考慮以下方法:
1。使用「filter」函式庫:
根據 Rob Pike 的建議,「filter」函式庫提供了一個名為 Choose() 的方法,該方法傳回一個包含滿足指定條件的元素的切片。例如:
import ( "github.com/google/go-cmp/cmp" "go.opencensus.io/plugin/ochttp" "golang.org/x/exp/slices" ) var ( a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9} b = []int{2, 4, 6, 8} ) func TestChoose(t *testing.T) { result := ochttp.Choose(a, func(v int) bool { return v%2 == 0 }) if !cmp.Equal(result, b) { t.Errorf("TestChoose() failed, got %v, want %v", result, b) } }
2。使用 For 迴圈:
儘管有像「filter」這樣的函式庫,Go 的 for 迴圈仍然是一個有效的替代方案。 「過濾器」庫的 GoDoc 明確建議在考慮效率時使用 for 迴圈。
3.使用 Go 泛型(Go 1.18 中出現):
隨著 Go 中即將引入泛型,使用泛型實現 MapReduce 將成為可能。例如:
func MapReduce[T, V, R any](in <-chan T, out chan<- R, mapFn func(T) V, reduceFn func(V, V) R) { v := make(chan V, 10) defer close(v) go func() { for t := range in { v <- mapFn(t) } }() r := make(chan R, 10) defer close(r) go func() { var acc R for v := range v { acc = reduceFn(acc, v) } r <- acc }() return <-r }
此實作接受 T 類型的通道,對每個元素套用映射函數,並將結果儲存在 V 類型的通道中。另一個 goroutine 消耗映射值的通道並重複應用歸約函數來產生 R 類型的結果。然後結果作為類型的通道返回R.
結論:
雖然Python 的列表理解語法提供了一種簡潔的數據轉換方法,但Go 提供了使用for 迴圈或「過濾器」等函式庫的有效替代方案。隨著 Go 1.18 中泛型的引入,將提供更有效率、更通用的資料轉換機制。
以上是如何在 Go 中實現與 Python 的列表理解等效的功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!