Go语言如何实现python的reduce、map、filter 等方法?

共 5 个回复


myself

func Map(f func (int) int, v []int) (r []int) {
    r = make([]int, len(v))
    for i, value := range v {
        r[i] = f(value)
    }
    return
}


func main () {
    v := []int{1, 2, 3, 4}
    fmt.Println(Map(func(x int) int {return x * 5}, v ))

}

刚学了俩小时,不知道标准库里有没有这种函数。不过用高阶函数是能实现的。只是不知道强类型语言里这个 int 怎么能搞更通用些。。。

# 0

snake117

sort包里有没有?

# 1

monnand

强类型的语言如果要支持map filter等方法,需要具备generic typing。类似的参见clojure haskell。Go如果要支持,map传进去的就需要是一个interface{},之后传入的函数也需要是interface{}做参数。而在传入的函数内部需要做类型转换。

# 2

adamzy

看看这一篇 http://blog.burntsushi.net/type-parametric-functions-golang

事实上Go可以实现一些functional programming的函数,而且用起来也不会太麻烦。

问题是性能损失比较大,有点得不偿失。

或者可以通过一些模版把代码转换成静态类型的Go语句,应该能够解决性能的问题。

不过这部分工作实际上应该是由编译器来解决的。

# 3

cgyy

type FuncVal func(int) interface{}

func Map(list interface{}, v FuncVal) []interface{}{ length := reflect.ValueOf(list).Len() result := make([]interface{}, length)

for i:=0; i< length; i++ {
    result[i] = v(i)
}
fmt.Println("test")
return result

}

func main() { list := []int{1, 2, 3} result := Map(list, FuncVal(func(i int) interface{} { return list[i] * 2 })) fmt.Println(result) }

# 4