格式
func 函数名(参数列表)(返回值列表){
}
参数列表
参数列表格式类似变量声明,但不需要var关键字
age int, name string
i1, i2 int
返回值列表
1、基本格式同参数列表
2、返回值可以没有变量名
3、当只有一个返回值,且返回值变量未命名时,或没有返回值时,括号可省略
多返回值
实现
1、直接return, 按顺序,依次附加上各个返回值
2、由于返回值都有变量名,可以直接对各个返回值变量进行赋值
调用return时,自动将各个返回值变量的值返回给调用语句
接收
1、准备对应的变量接收函数返回的值
2、不需要接收的变量使用匿名变量(_)接收
函数调用
包内函数:直接调用
包外函数:
1、导入包
2、调用包外函数:包名.函数名(实参表)
3、函数名必须大写字母开头
不定参数的函数
1、不限制不定参数的个数,但是限制不定参数的类型
最后一个参数类型:
...type
...type:本质上是一个数组切片,即
[]type
可以通过访问数组切片元素的方式来获取实参
2、不定参数的函数中向另一个不定参数的函数传递参数
myfunc(args
...) //原样传递
myfunc(args[1:]
...) //传递部分
3、任意类型的不定参数
1)、参数类型:
...interfase{}
2)、获取各个实参的类型
for
_, arg := range args{
switch
arg.(type){
case int:...
case string:...
...
}
}
匿名函数
由
一个不带函数名的函数声明和
函数体构成
可以直接赋值给变量,或直接执行
f := func (x int) int{...}
func(x int) int{...}
(2)
//带“(2)”表示,直接调用,参数为2
闭包
定义
包含自由变量的代码块
自由变量: 不在闭包内和任何全局上下文中定义,而是在定义闭包的环境中定义
作用
只要闭包还会被调用,闭包中引用的变量(包含自由变量)就不会被释放
闭包为自由变量提供绑定的计算环境
价值
闭包可以做为函数对象或匿名函数,存储到变量中,做为参数进行传递
能够被函数动态的创建和返回
实例
func main(){
j := 5
fa := func()(func()){ //匿名函数,返回值为一个函数,直接赋值给fa
i := 10 //i: 自由变量,只有匿名函数能访问到,保证其安全
return func(){ //返回闭包
fmt.Println(i, j)
}
}() //(): 表示匿名函数直接运行
fa() //调用闭包
j *= 2
fa()
//调用闭包
}