Go函数特点
- 支持多返回值
- 支持命名返回参数
- 支持匿名函数和闭包
- 函数也是一种类型,一个函数可以赋值给变量
- 不支持 嵌套 (nested) 一个包不能有两个名字一样的函数
- 不支持 重载 (overload)
- 不支持 默认参数 (default parameter)
基本使用
普通函数声明
func 函数名(形式参数列表)(返回值列表){
函数体
}
使用关键字func定义函数,左大括号依旧不能另起一行
相邻参数类型一致的,则可以用一个来表示
返回值有多个类型的必须放在括号里面
// 普通方式
func test(x int, y int, s string) (int, string) {
return x ,s
}
// x,y 属于同一个类型 可以实现参数合并
func test(x, y int, s string) (int, string) {
z := x + y
return z, s
}
有参数无返回值
func login(x int, y int) {
println(x, y)
}
无参数有返回值
func login() bool{
return true
}
如果有不定参数,必须作为函数的最后一个参数
func forgot(x, y int, arr ...int) {
println(x, y)
fmt.Println(arr)
}
// 调用
forgot(x, y, 1, 2, 3)
函数参数传递
值传递:在调用函数的时候将实际参数赋值一份传递的函数中,在函数中对参数修改,不会影响到全局
func swap(x, y int) int {
...
...
}
引用传递:调用函数时将实际参数的地址传递到函数中(指针传递),那么在函数中对参数所进行的修改,将影响到全局
// 传递地址(指针、门牌号,指向同一块内存)
func swap(x, y *int) {
var temp int
temp = *x /* 保存 x 的值 */
*x = *y /* 将 y 值赋给 x */
*y = temp /* 将 temp 值赋给 y*/
}
func main() {
var a, b int = 1, 2
// 传递指针
swap(&a, &b)
// a,b的值进行交换
fmt.Println(a, b)
}
函数返回值
_标识符,用来忽略函数的某个返回值
Golang返回值不能用容器对象接收多返回值。只能用多个变量,或 "_" 忽略。
func test() (int, int) {
return 1, 2
}
func main() {
// x = test() // Error: multiple-value test() in single-value context
// _忽略
x, _ := test()
println(x)
}
命名返回参数可看做与形参类似的局部变量,最后由 return 隐式返回。
func add(a, b int) (c int) {
c = a + b
return
}
命名返回参数可被同名局部变量遮蔽,此时需要显式返回。
func add(x, y int) (z int) {
{ // 不能在一个级别,引发 "z redeclared in this block" 错误。
var z = x + y
// return // Error: z is shadowed during return
return z // 必须显式返回。
}
}