函数
概念
执行特定任务的代码块
声明
go语言至少有一个main函数
-
语法格式
func funcName(parametername type1,parametername type2)(out1 type1,out2 type2){ return value1,value2 }
- func: 函数由func声明
- funName:函数名称,函数名称和参数列表一起构成函数签名
- parametername type: 参数列表,参数就像一个占位符,但函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型,顺序,及参数个数。参数是可选的,也就是说参数也可以不包含参数。
- out1 type1:返回类型,函数返回一列值。
- 上面返回值声明了两个变量out1和out2,如果不想声明也可以,直接写两个类型type1,type2也可以。
- 如果只有一个返回值且不声明返回值变量,那么你可以省略包裹返回值的括号(即一个返回值可以不声明)
-
参数
-
形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参
-
实际参数:调用参数时,传给形参的实际数据,叫做实际参数,简称实参
-
参数调用:
- 函数名称必须匹配
-
实参与形参必须一一对应:顺序,个数,类型
-
如果参数类型相同,还可以简化写法
func getAdd(a,b int){ fmt.Printf("%d+%d=%d ",a,b,a+b) }
-
可变参数
-
语法
func funName(arg ...int){ } //注意,这里得参数全部都是int型得 //在函数体中,arg是一个int型得切片 //调用带可变参数得函数时,可以传入任意数量的参数,也可以不传入任何参数
func getSum(args ...int){ fmt.Printf("%T",args) //[]int }
-
常用可变参的函数
Println() Printf() Print()
append()
-
将切片作为参数,调用可变参函数
s1 := []int{1,2,3} getSum(s1...) //切片变量后加上三个点...(s1...),才能作为可变参数传入函数
-
注意事项
- 如果一个函数的参数是可变参数,同时还有其他参数,可变参数要放在参数列表的最后
- 一个参数列表中,最多只能有一个可变参数
-
-
-
参数传递
-
数据类型
一. 按照数据类型来分:
基本数据类型:
int,float,string,bool
符合数据类型:
array,slice,map,struct,interface
二.按照数据的存储特点来分:
值类型的数据:操作的数值本身
int,float,bool,string,array,struct
引用类型的数据:操作的是数据的地址
slice,map,chan
-
go函数的参数也是存在值传递和引用传递的
-
值传递:传递的是数据的副本,修改数据,对于原始数据没有影响
值类型的数据,默认都是值传递
-
引用传递:传递的是数据的地址。导致多个变量指向同一块内存,通过参数传递的是地址副本。
引用类型的数据,默认都是引用传递。
-
-
-
函数返回值
-
定义
一个函数被调用后,返回给调用处的执行结果,叫做函数的返回值。调用处需要用变量接收返回结果
-
无定义变量返回值
func getAdd(a,b int) (int) { int sum = a + b fmt.Printf("%d+%d=%d ",a,b,sum) return }
-
有定义变量的返回值
//这种写法实际就是现在函数中定义了一个变量sum,值也就是这种类型的零值 func getSum(args ...int)(sum int) {//定义函数时,指明要返回的数据是哪一个。 for _,v := range args { //fmt.Println(v) sum += v } return } //如果函数末尾使用了return 0,则getSum函数会返回0,不再是sum的真实值了
-
-
多返回值
func getSum2()(int ,int){ //无定义变量形式 return 0,2 } func getSum3()(a,b int){//有定义变量形式 a,b = 1,2 return }
-
return语句
-
一个函数定义了返回值,必须使用return语句将结果返回调用处。
-
return后的数据必须与函数定义一致:个数,类型,顺序
-
可以使用_,舍弃多余的返回值
-
如果函数定义定义了返回值,那么函数中有分支,循环,那么要保证,无论执行了那个分支,都要有return语句被执行到。
-
如果函数没有定义返回值,那么函数中也可以使用return,专门用于结束函数的执行。
-
函数中变量作用域
-
作用域
变量可以使用的变量
-
局部变量
函数内部定义的变量
变量在哪里定义,就只能在哪个范围内使用,超出这个范围,我们认为变量就被销毁了
范围内部定义的变量会覆盖范围外部的同名变量
-
全局变量
函数外部定义的变量
短变量不能定义在函数外部
所有函数都可以使用,而且共享这一份数据