1. 将函数作为参数,调用时传入自定义的函数,实现对每个元素的
func main() { s := make([]int, 0, 10) for i := 0; i < 10; i++ { s = append(s,i) } fmt.Printf("原来素组 :%#4v\n", s) //对slice的元素进行平方 result, e := operateSliceByFunc(s, func(n int) (int, error) { return n * n, nil }) if e == nil { fmt.Printf("对每个元素进行平方运算:%#4v\n", result) } s = make([]int, 0, 10) for i := 0; i < 10; i++ { s = append(s,i) } //对slice的元素进行加10操作 result, e = operateSliceByFunc(s, func(n int) (int, error) { return n+10, nil }) if e == nil { fmt.Printf("对每个元素进行加10运算:%#4v\n", result) } } func operateSliceByFunc(s []int, f func(n int) (int, error)) ([]int, error) { for i := 0; i < len(s); i++ { result, e := f(s[i]) if e == nil { s[i] = result } else { return make([]int, 0, 0), e } } return s, nil }
输出结果:
原来素组 :[]int{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
对每个元素进行平方运算:[]int{ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
对每个元素进行加10运算:[]int{ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
1.1 定义了一个函数operatrSliceByFunc,参数是slice和函数,在operatrSliceByFunc内部调用参数函数。
1.2 调用时,传入自定义的函数,对slice的元素实现自定义的操作。第一次调用对元素平方操作,第二次调用对元素实现加10操作。
1.3 格式化输出可以参考How to format anything (string, number or arbitrary data) with fmt
2. 利用go的函数特性,对现有的函数进行功能增强
func main() { funcLog := FuncLog(foo) result, e := funcLog() if e == nil { fmt.Printf("slice: %#v", result) } } func foo() ([]int, error) { s := make([]int, 0, 10) for i := 0; i < 10; i++ { time.Sleep(time.Millisecond * 1000) s = append(s, i) } return s, nil } func FuncLog(f func() ([]int, error)) func() ([]int, error) { return func() ([]int, error) { start := time.Now().Unix() result, e := f() end := time.Now().Unix() log.Printf("function fooFunc run time: %d", end-start) return result, e } }
1. 定义了一个普通函数foo。
2. 定义了FuncLog函数增强foo函数功能,打印foo函数执行的时间。调用FuncLog,我们得到一个新的函数,不行能得到foo函数的执行结果,而且能打印foo执行的时间。
未完待续。。。。。。