【golang】实现数组 map 方法
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