目录
函数
语法格式
函数的参数使用
可变参数的使用
参数传递
函数的返回值
匿名函数
递归函数
斐波那契数列
函数需要写在主函数(main函数)外面
funcName函数名。如果首字母大写,则所有包都可以调用;如果首字母小写,只能被本包访问。
fucn funcName(parameter_name1 type1, parameter_name2 type2, ...) (output_name1 type1, output_name2 type2, ...) {
//逻辑代码
//多个返回值
return value1, value2
}
调用函数语法
funcName(parameter)
func main() {
sum := getSum(10, 20)
fmt.Println("10到20的和:", sum)
}
func getSum(a, n int) int {
sum := 0
for i := a; i <= n; i++ {
sum += i
}
return sum
}
//输出:
//10到20的和: 165
可变参数:一个函数的参数类型确定,但是参数的个数不确定。
- 如果一个函数有可变参数,也有其他参数,那么可变参数要放在参数列表的最后
- 一个函数的参数里,最多只能由一个可变参数
- 在函数中,可变参数就是切片
可变参数语法
func func_name(parameter_name ... type) { ... }
示例
func main() {
getNums(10, 20, 30, 31, 40)
}
func getNums(nums ...int) {
fmt.Println("函数中可变参数nums:", nums)
fmt.Printf("函数中可变参数nums的类型:%T\n", nums)
}
参数传递时分两种情况
值传递:传递的实参时值类型的时候,将值复制一份给形参。
引用传递:传递的实参是引用类型的时候,如slice。slice存的是底层array的内存地址,则是复制一份底层array的内存地址给形参。
函数中的值的作用域都是在函数内部。如果要在函数外部获取函数中的值,则可以通过返回值列表,定义函数返回值。将函数中的值作为返回值传递至外部。
- 函数返回值列表的返回值名字写不写都可以,可以只写返回值类型。
- 如果函数的定义里有返回值,则函数内部必须有return语句,将结果返回给调用处。
- 可以在函数返回值列表中,指定要返回的值名,这样return语句后面可以省略返回值名称。
- 函数一旦出现retrun语句,函数就结束了。所以retrun语句一定要写在执行逻辑的最后。
- 返回值可以有多个,且类型可以不同。返回值的顺序同retrun后面的顺序。
func main() {
fnum, lnum := getNums(10, 20, 30, 31, 40)
fmt.Printf("fnum的值:%v, fnum的类型:%T \nlnum的值:%v, lnum的类型:%T \n", fnum, fnum, lnum, lnum)
}
func getNums(nums ...int) (firstNum int, lastNum string) {
firstNum = nums[0]
tmpNum := nums[len(nums)-1]
lastNum = strconv.Itoa(tmpNum)
return firstNum, lastNum
}
匿名函数就是没有名字的函数。
通常匿名函数只能执行一次。也可以将匿名函数赋值给某个变量,就可以执行多次了。
匿名函数作用:
- 回调函数:将匿名函数作为参数传入
- 闭包:将匿名函数作为返回值
func main() {
func() {
fmt.Println("我是一个匿名函数,func1")
}()
func2 := func(p string) {
fmt.Println("我是一个匿名函数,func2;本次传参的值:", p)
}
func2("a")
func2("xxx")
}
第一个匿名函数,由于没有赋值给变量,只能使用一次。
第二个匿名函数,赋值给了func2,所以可以多次调用func2。
递归函数,就是函数本身会不停调用自己,但是会有个终点。
示例
func main() {
fmt.Println(recursion(5))
}
func recursion(n int) int {
if n == 1 {
return 1
}
return recursion(n-1) + n
}
fibonacci数列:前两项为1,后面的每一项都等于前两项的和
使用递归的方法,,打印fibonacci数列。
func main() {
for i := 1; i<=12;i++{
fmt.Printf("%d ",getFibonacci(i))
}
}
func getFibonacci(n int)int{
if n ==1 || n==2{
return 1
}
return getFibonacci(n-1)+getFibonacci(n-2)
}