Golang 函数作为一等公民

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执行的时间。

未完待续。。。。。。


猜你喜欢

转载自blog.csdn.net/fengxiaozhuzhu/article/details/80949272