一、定义
func 函数名( [参数列表] ) [返回类型] {
函数体
}
- func:函数由 func 开始声明
- 函数签名:由参数列表和返回值类型构成
- 参数列表:参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数
- 返回类型:函数返回一列值,是列值的数据类型。有些功能不需要返回值,这种情况下返回类型不是必须的
- 函数体:函数定义的代码集合
二、使用
函数本身不仅能实现自定义功能,还能作为数据类型被使用(被誉为一等公民)
声明函数的过程其实就是声明变量的过程。那么函数作为一个变量,是可以做参数传递和返回值的。由于函数的这种灵活性,让go做到了真正的函数式编程
三、参数和返回值
参数的使用
- 不传参数
func noParams()(int,int){
return 1,2
}
- 传多个参数
func swap (x,y int)(int,int){
return y,x
}
- 参数不固定
参数的传递类型
| 传递类型 | 描述 |
|---|---|
| 值传递 | 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 |
go只有值传递,但对于引用类型(切片、map、指针等),传递的是 “地址的拷贝”,使用的引用类型的特性,而非 “引用传递” 的语法机制,需要占用空间
返回值
可以是0个、1个或者多个。命名返回值
四、匿名函数
匿名函数:没有函数名的函数
五、闭包
由 “函数” 与 “该函数创建时所处的词法作用域” 构成的组合体,核心是函数可访问其词法作用域内的自由变量,即便函数在词法作用域之外执行,这些变量仍能被持续引用且状态保持一致。简单来说,闭包=函数+引用环境(执行上下文)