函数是组织好的,可以重复利用的,用来实现单一或相关联功能的代码段,可以提高应用的模块性和代码的重复利用率。
函数声明(定义)
函数的基本组成为:关键字(func),函数名,参数列表,返回值列表,函数体,返回语句。
普通函数声明(定义)
func 函数名 (形参列表) (返回值列表) {
函数体
}
return 可以作为语句的结束退出,也带一个或多个作为返回值给调用者使用(函数在声明时,包含了返回值列表,那么函数必须以 return 语句结尾)
函数的返回值
Go语言支持多返回值,通常以返回值的最后一个返回参数返回执行中可能发生的错误。
例:conn, err := connectToNetWork()
1:同一种类型的返回值
如果返回值是同一种类型,则用括号将多个返回值类型括起来,return 返回时,返回值顺序与函数声明的返回类型顺序一致,示例代码如下
func typedTowValues() (int, int) {
return 1, 2
}
2:带有变量名的返回值
Go语言支持对返回值进行命名,这样返回值就和参数一样拥有参数变量名和类型。
下例中,可以直接对返回值列表中的a,b进行赋值,从而在 return中不填写返回值列表
func nameRetValue() (a,b int) {
a = 1
b = 2
return
}
调用函数
返回值变量列表 = 函数名(参数列表)
函数值传递和引用传递
值传递:也就是传递参数的副本,函数接收参数副本之后,在使用变量的过程中只能对副本进行修改,但是不会影响到原来的值,如 func(arg1)
引用传递:可以直接修改参数的值,而不是对参数副本进行操作,比如在变量名前加 & 符号传递给函数,就是按引用传递,此时传给函数的是一个指针,如 func(&arg1)
引用传递消耗比值传递少,因此函数调用时,像slice,map,interface,channel类型都是使用引用传递(即使没有显示的指出指针)
函数变量 -- 将函数作为值保存到变量中
Go语言中,函数也是一种类型,也可以和其他变量一样保存在变量中
例:func fire() {
fmt,Println("fire")
}
func main() {
var f func() //声明未func()类型,此时 f 被俗称为 "回调函数" ,f 的值为nil
f = fire //将fire() 函数名作为值,赋给f变量, 此时 f的值为fire()函数
f() // f 变量进行函数调用,实际上调用的是fire()函数
}
匿名函数
匿名函数是指不需要定义函数名的一种函数实现方式,即函数可以像普通变量一样传递或使用
例: func (参数列表) (返回值列表){
函数体
}
1:在定义时调用匿名函数
例如: func(data int) {
fmt.Println("this is go", data)
} (100) //表示对匿名函数进行调用
2:将匿名函数赋值给变量
f := func(data int) { // 将匿名函数体保存到f()中
fmt.Println("hello", data)
}
f(100) // 使用f()调用