mapgolang
numbers := []int{1, 2, 3}
// convert to []interface{}
interfaceNumbers, err := utils.ToInterface(numbers)
utils.Check(err)
dup := utils.Map(interfaceNumbers, func(item interface{}) interface{} {
v, ok := item.(int)
if !ok {
utils.Check(fmt.Errorf("assert error"))
}
return v + 1
})
fmt.Println(dup) // [ 2, 3, 4 ]
其实跟其他支持函数式的语言无异,只是多了个类型断言,这是有点麻烦也迫不得已的地方,先别急,实现会放到下面。
mapGolang[]interface{}[]interface{}
map
func Map(slice []interface{}, cb func(interface{}) interface{}) []interface{} {
dup := make([]interface{}, len(slice))
copy(dup, slice)
for index, val := range slice {
dup[index] = cb(val)
}
return dup
}
copy
mapslicecb[]interface{}sliceslice[]interface{}panicgolanginterface{}[]interface{}
这里就不再赘述了。
[]interface{}
func ToInterface(slice interface{}) ([]interface{}, error) {
v := reflect.ValueOf(slice)
if v.Kind() != reflect.Slice {
return nil, fmt.Errorf("argument must be a slice")
}
r := make([]interface{}, v.Len())
for i := 0; i < v.Len(); i++ {
r[i] = v.Index(i).Interface()
}
return r, nil
}
ToInterface