什么是函数
将一些代码进行重用的一种机制
就是慕课网的老师所用的方法 定义函数func 然后在main函数中使用函数名不能重名,小写和大写的不一样
例如有需求要计算有未知个数的值的和
代码内有3种不同的计算方法
不定参数
// 参数名 自己起 ... type 有未知数量的数值要求求和
func sum(args...int){
//sum :=args[0]+args[1]+args[2]+args[3]
//fmt.Println(args)
sum:=0
//for i:=0;i<len(args);i++{
// sum+=args[i]
//
//}
for _,r:=range args{
sum+=r
}
fmt.Println(sum)
func main() {
//参数的传递
sum(1,2,3,4,10)
}
不定参数放在最后
函数调用,固定参数必须传值,不定参数根据需要决定是否传值
函数的嵌套
- 函数嵌套就是一个函数中调用另一个函
- 函数嵌套的执行过程
- 函数嵌套的调用的应用
- 不定参数的调用
//不定参数的传值
func bu1(args... int) {
fmt.Println(args)
}
func bu2(args... int) {
bu1(args[0:5]...)
bu1(args[:]...)
bu1(args...)
}
func main() {
//函数嵌套就是一个函数中调用另一个函
//函数嵌套的执行过程
//函数嵌套的调用的应用
//不定参数的调用
bu2(1,2,3,4,5,6,7,8,9)
输出
[1 2 3 4 5]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
函数的返回值
写在func代码的第一个()后,return值回来
func Test(a,b int) (c,d,sum int) { //可以返回多个值,但都要接受,也可以使用匿名变量
//a:=1
//b:=2
sum=a+b
return
//不同写法,3种
}
func main() {
var res int
var res2 int
res,_,res2=Test(2,3)
fmt.Println(res,res2)
}
函数类型
面向对象中用到
内存四区分别为代码区,数据区,堆区,栈区
函数作用域
作用域与作用范围
局部变量
定义在函数内部的变量是局部变量,局部变量的作用域在函数内部有效
不同的函数可以定义相同的局部变量名,互不影响,因为作用域不同
变量先声明再使用,在函数内部,变量名是唯一的
全局变量定义在函数外部的变量,全局变量的作用域是在整个文件
全局变量名不能和其他文件中的全部变量名重合
-全局变量尽量不要和局部变量重名,虽然可以重名
如果全部变量名和局部变量名相同,那么会使用局部变量,就近原则
匿名函数与闭包
package main
import "fmt"
// 匿名函数类型
func test5() func()int {
var x int
return func()int{
x++
return x
}
}
func main() {
//匿名函数就是指没有名字的函数func
//var num int
//num = 10
//func() {
// num++
// fmt.Println(num)
//} () //去掉13行的f()和9行的f:= 加个()在花括号后也可以调用函数
////f()
//fmt.Println(num)
////参数传递
////1.
//func(a,b int){
// sum:=a+b
// fmt.Println(sum)
// }(3,5)
//匿名参数返回值
//x,y:=func(a,b int)(max,min int) {
// if a>b {
// max=a
// min=b
// }else {
// max=b
// min=a
// }
// return
//}(64,46)
//fmt.Println(x,y)
//闭包
//匿名函数最主要的功能是实现闭包
//闭包不关心作用域,只要有闭包还在使用,变量就会存在
q:=test5()
fmt.Println(q())
fmt.Println(q())
fmt.Println(q())
}
闭包
匿名函数最主要的功能是实现闭包
闭包不关心作用域,只要有闭包还在使用,变量就会存在
递归函数
递归函数就是调用函数本身
递归函数相同的结构
-
有跳出条件
1.PNG
最内的方框结束循环后将a逐次打印出来
100以内的值的递归函数解决fanfare
func onehundred(a int) int {
if a == 100 {
return 100
}
return a+onehundred(a + 1)
}
func main() {
fmt.Println(onehundred(0))