四时宝库

程序员的知识宝库

Go语言基础—函数(2)(go语言函数库)

一、可变参数函数

1、简介

  • 可变参数指调用参数时,参数的个数可以是任意个
  • 可变参数必须在参数列表的最后的位置,在参数名和类型之间添加三个点表示可变参数函数
func 函数(参数,参数,名称 ... 类型) {
    //函数体
}
  • 输出语句就是可变参数函数,源码如下
func Println(a ...interface{}) (n int, err error) {
   return Fprintln(os.Stdout, a...)
}
  • 声明函数时,在函数体把可变参数当作切片使用即可

2、示例

  • 可变参数声明与调用
func main() {
   demo("aaa", "bbb", "ccc")
}
func demo(hover ... string)  {
   for a, b := range hover {
      fmt.Println(a, b)
      /*输出:
      0 aaa
      1 bbb
      2 ccc
       */
   }
}


  • 可变参数必须存在其它参数后面,一个函数不能有多个可变参数

因为前面普通参数个数是确定的,编译器知道,哪个实参给哪个形参

func main() {
   demo("张三", "看书", "写代码", "打篮球")
}
func demo(name string, hover ... string)  {
   fmt.Println(name, "的爱好是" )
   for a, b := range hover {
      fmt.Println(a, b)
      /*输出:
      张三 的爱好是
      0 看书
      1 写代码
      2 打篮球
       */
   }
}

二、匿名函数

  • 匿名函数就是没有名称的函数
  • 正常函数可以通过名称多次调用,而匿名函数由于没有函数名,所以大部分情况都是在当前位置声明并立即调用(函数变量除外)
func () {
    
}() //括号表示调用
  • 匿名函数都是声明在其它函数内部
  • 无参数匿名函数
func main() {
   func () {
      fmt.Println("这是匿名函数")  
   }()//括号表示调用
}
  • 有参数匿名函数
func main() {
   func (s string) {
      fmt.Println(s,"这是传递的参数") //传递参数 这是传递的参数
   }("传递参数")//括号表示调用
}
  • 有返回值的匿名函数
func main() {
   //有返回值的匿名函数
   name := func() string{
      fmt.Println("有返回值的匿名函数") //有返回值的匿名函数
      return "佳明哥"
   }()//此处有调用
   fmt.Println(name) //佳明哥
}

三、函数变量

1、函数作为变量

  • 在Go语言中函数也是一种类型,函数有多少种形式,函数变量就有多少种写法
func main() {
   var a func()  //无参数返回值
   var b func(int) //有一个int类型参数
   var c func(int) string //有一个int类型参数和string类型返回值
   fmt.Println(a, b, c)  //输出:<nil> <nil> <nil>
}
  • 定义完函数变量后,可以使用匿名函数进行赋值,也可以使用已经定义好的函数进行赋值
  • 函数变量定义以后与普通函数调用语法相同,变量名就是普通函数声明的函数名
func main() {
   var a func()
   a = func() {
      fmt.Println("执行函数")
   }    //注意此处没有括号,变量a就表示接收函数返回值
   a() //调用函数

   /*
   也可以使用短变量方式定义函数变量
   等效于
   func b(s string) {
       //...
   }
    */
   b := func(s string) {
      fmt.Println("执行第二个函数")
   }
   b("参数")

   //使用定义好的函数
   d := c
   d()  //输出:c函数

   //函数名称也是一个变量
   c() //输出:c函数
}

func c() {
   fmt.Println("c函数")
}


  • 函数类型变量是除了slice、map、channel、interface外第五种引用类型
func main() {
   var a func()
   a = b
   a()
   var c func()
   c = a
   c()
   fmt.Printf("%p %p", a, c) //输出地址相同:0x9d73c0 0x9d73c0
}

func b() {
   fmt.Println("b")
}


2、函数作为参数或者返回值

  • 变量可以作为函数的参数或返回值类型,而函数既然可以当作变量看待,函数变量也可以当作函数的参数或返回值
  • 函数作为参数时,类型写成对应的类型即可
func main() {
   a(
   func(s string) {
      fmt.Println(s)
   }
   )
}

func a(b func(s string)) {
   fmt.Println("a执行")
   b("传递给s的内容")
}
  • 函数作为返回值
func main() {
   //此时result指向返回值函数
   result := a()
   //调用函数,才能获取结果
   fmt.Println(result())
}

func a() func() int {
   return func() int {
      return 110
   }
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接