1.介绍
函数是基本的代码块,Go是编译型语言,所以函数编写的顺序是无关紧要的,但是我们一般把main()函数写在文件的前面,其他函数按照一定的逻辑顺序编写(例如函数被调用顺序)。
编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。而且,同一个任务(函数)可以被调用多次,有助于代码重用。
注:Don’t Repeat Yourself,执行特定任务的代码只能在程序里面出现一次
Go里面有三种类型的函数:
1.普通的带有名字的函数
2.匿名函数或者lambda函数
3.方法methods
除了 main ()、init () 函数外,其它所有类型的函数都可以有参数与返回值。函数参数、返回值以及它们的类型被统称为函数签名。
函数的基本格式:
func g() {
}
函数被调用的格式:
pack1.Function(arg1, arg2, …, argn)
例如:
package mainimport "fmt"func main() {fmt.Println("are u greeting?")greeting()fmt.Println("year")
}func greeting() {fmt.Println("greeting")
}are u greeting?
greeting
year
2.多值返回
Go函数支持多值返回,定义多值返回的返回参数列表时要使用"()"包裹,支持命名参数的返回,例如:
package mainimport "fmt"func main() {fmt.Println(swap(1, 9))
}func swap(a, b int) (int, int) {return b, a
}9 1
3.实参到形参的传递
Go函数实参到形参的传递永远是值拷贝,有时候函数调用后实参指向的值发生了变化,那是因为参数传递的是指针值的拷贝,实参是一个指针变量,传递给形参的是这个指针变量的脚本,二者指向同一个地址,本质上参数传递仍是值拷贝,例如:
package mainimport "fmt"func chvalue(a int) int {a = a + 1return a
}
func chpointer(a *int) {*a = *a + 1return
}
func main() {a := 10chvalue(a)fmt.Println(a)chpointer(&a)fmt.Println(a)
}10
11
重点:chvalue函数是实参传递给形参是值拷贝,chpointer函数是实参传递给形参也是值拷贝,但是复制的是a的地址值
4.不定参数
Go函数支持不定数目的形式参数,不定参数的声明使用param...type的语法格式。
函数的不定参数有以下特点:
1. 所有的不定参数类型必须是相同的
2. 不定参数必须是函数的最后一个参数
3. 不定参数名在函数体内相当于切片,对切片的操作同样适合对不定参数的操作
func sum(arr ...int) (sum int) {
for _, v : = range arr { //此时 arr 就相当于切片,可以使用 range
sum += v
return
}
4. 切片可以作为参数传递给不定参数,切片名后面要加上'...'
func sum(arr ...int) (sum int){for _,v :=range arr {sum +=v}return
}func main(){slice := []int{1,2,3,4}array := [...]int{1,2,3,4} //数组不可以作为实参传递给不定参数的函数sum(slice...)
}
5. 形参为不定参数的函数和形参为切片的函数类型不同