亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可以使用泛型在 Go 中實現“映射”和“減少”嗎

可以使用泛型在 Go 中實現“映射”和“減少”嗎

Go
慕沐林林 2022-12-19 21:35:44
我決定既然泛型已經被引入到 Go 中,那么類似的東西map/reduce應該是可能的。所以,我天真地嘗試了一下,我得到了錯誤: ./prog.go:18:36: cannot use thing (variable of type int) as type I in argument to mapper這并不能解釋問題是否是根本性的,或者我只是在語法上做錯了什么。通用 map/reduce 可以在 Go 中實現嗎?package mainimport "fmt"func main() {    things := []int{1, 2, 3, 4}    results := Map(things, func(t int) int {        return t + 1    })    fmt.Printf("%v", results)}func Map[I interface{}, O interface{}](things []I, mapper func(thing I) O) []O {    results := make([]O, 0, len(things))    for thing := range things {        results = append(results, mapper(thing))    }    return results}
查看完整描述

2 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

您對 . 的使用不正確range。從中提取的單個變量range將是索引(類型int),而不是值(類型I,在這種情況下只是巧合int)。

嘗試

for _, thing := range things{...}


查看完整回答
反對 回復 2022-12-19
?
守候你守候我

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

}


查看完整回答
反對 回復 2022-12-19
  • 2 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號