2 回答

TA貢獻1784條經驗 獲得超8個贊
您對 . 的使用不正確range
。從中提取的單個變量range
將是索引(類型int
),而不是值(類型I
,在這種情況下只是巧合int
)。
嘗試
for _, thing := range things{...}

TA貢獻1802條經驗 獲得超10個贊
這可以很容易地完成。你的代碼有錯誤,但就在這里:
for thing := range things {
您正在遍歷索引值 (int),而不是 type 的值I。您還指定了 2 個約束(類型I和O)都設置為interface{}。您可以any改用(它是 的簡寫interface{})
所以簡單地寫:
func Map[T any, O any](things []T, mapper func(thing T) O) []O {
result := make([]O, 0, len(things))
for _, thing := range things {
result = append(result, mapper(thing))
}
return result
}
演示
這與我在 codereview exchange here上審查的一些代碼密切相關。在瀏覽了代碼并編寫了帶有大量建議的片段之后,我決定只創建一個包并將其放在 github 上。你可以在這里找到回購協議。
在其中,有一些示例可能會派上用場,或者幫助您解決 golang 中 WRT 泛型的其他一些怪癖。我特別考慮了這一點,您可以在其中使用回調來過濾通用地圖類型,如下所示:
// given the sMap type
type sMap[K comparable, V any] struct {
mu *sync.RWMutex
m map[K]V
}
// Filter returns a map containing the elements that matched the filter callback argument
func (s *sMap[K, V]) Filter(cb func(K, V) bool) map[K]V {
s.mu.RLock()
defer s.mu.RUnlock()
ret := make(map[K]V, len(s.m))
for k, v := range s.m {
if cb(k, v) {
ret[k] = v
}
}
return ret
}
- 2 回答
- 0 關注
- 138 瀏覽
添加回答
舉報