匿名和变长函数

* 本页面主要介绍Go语言匿名和变长函数的相关内容。

顾名思义,匿名函数就是只有函数体没有函数名字的函数!这样,我们就可以随时在需要使用函数时再定义函数,增大了灵活性。通常会以 函数变量 的方式传递。

  //定义一个fire()函数
  // 将匿名函数体保存到f()中
  f := func(data int) {
      fmt.Println("hello", data)
  }

  // 使用f()调用
  f(100)

上面是比较普遍的使用方式,当然,匿名函数可以在声明后立即调用:注意下面示例代码中第3行}后的(100),表示对匿名函数进行调用,传递参数为 100。

  func(data int) {
      fmt.Println("hello", data)
  }(100)
匿名函数的使用场景

匿名函数的用途非常广泛,它本身就是一种值,可以方便地保存在各种容器中实现回调函数操作封装

实现回调函数:

  // 遍历切片的每个元素, 通过给定函数进行元素访问,这个函数参数就是回调参数
  func visit(list []int, f func(int)) {
      for _, v := range list {
          f(v)
      }
  }
  func main() {
      // 使用匿名函数打印切片内容
      visit([]int{1, 2, 3, 4}, func(v int) {
          fmt.Println(v)
      })
  }

实现操作封装:

  //定义命令行参数 skill,从命令行输入 --skill 可以将=后的字符串传入 skillParam 指针变量
  var skillParam = flag.String("skill", "", "skill to perform")
  func main() {
      //解析命令行参数,解析完成后,skillParam 指针变量将指向命令行传入的值
      flag.Parse()
      //定义字符串映射函数的map
      var skill = map[string]func(){
          "fire": func() {
              fmt.Println("chicken fire")
          },
          "run": func() {
              fmt.Println("soldier run")
          },
          "fly": func() {
              fmt.Println("angel fly")
          },
      }
      //如果找到对应的匿名函数,执行对应的函数
      if f, ok := skill[*skillParam]; ok {
          f()
      } else {
          fmt.Println("skill not found")
      }
  }

还有一个重要的应用,那就是闭包!我们将在闭包和递归 一节重点讲解。

变长函数

变长函数就是指参数可变的函数,这并不是一个官方的概念,只是可能会在一些场景下听到这种叫法或称呼,知道即可。可变参数将在 可变参数 详细讲解。

这部分内容就总结到这里,了解了不?


* 本页内容参考以下数据源:

  • 《Go程序设计语言》
  • http://c.biancheng.net/view/57.html

凯冰科技 · 代码改变世界,技术改变生活
Next Page→