函数--Go语言学习笔记
Posted 旧时星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数--Go语言学习笔记相关的知识,希望对你有一定的参考价值。
函数–Go语言学习笔记
函数的定义
func funcName(形参1 type1,形参2 type2) (返回值1 type1,返回值2 type2){
//函数体
return value1,value2//go语言支持多返回值
}如果形参1和形参2的类型一样可以合并为(形参1,形参2,返回值类型)
函数的参数
形式参数:也叫形参。函数定义的时候,用于接受外部传入的数据的变量。函数中,某些变量的数值无法确定,需要由外部传入数据。
实际参数:也叫实参。函数调用时,给形参赋值的实际的数据。
函数的调用:
1.函数名:声明的函数名和调用的函数名要统一。
2.实参必须严格匹配形参:顺序,个数,类型,一一对应。
可变参
概念:一个函数的参数的类型确定,但是个数不确定。就可以使用可变参数。
语法:参数名…参数的类型
对于函数,可变参数相当于一个切片。
调用函数的时候,可以传入0-多个参数。
Println(),Printf(),Print()
append()
注意事项:
A:如果一个函数的参数时可变参数,同时还有其他的参数可变参数要放在参数列表的最后面。
B:一个函数的参数列表最多只能有一个可变参数。
func getSum(nums..int){
sum:=0
for i:=0;i<len(nums);i++{
sum+=nums[i]
}fmt.Println("总和是:",sum)
}
参数传递
A:值传递:传递的是数据的副本。修改数据,对于原始数据没有影响。值类型的数据,默认都是值传递:基础类型,arry,struct
B:引用传递:传递的是数据的地址。导致多个变量指向同一块内存。引用类型的数据,默认都是引用传递:slice,map,chan.
函数带一个返回值
func getSum()int{//返回值为 int
sum:=0
for i:=1;i<=10;i++{
sum+=i
}
return sum
}
func getSum2()(sum int){//定义函数时,指明返回的数据是哪一个
for i:=1;i<=100;i++
{
sum+=i
}
return
}
带多个返回值
func rectangle(len,wid float64)(peri float64,area float64){//已指明返回的数据
peri=(len+wid)*2
area=len*wid
return
}
空白标识符–专门用来舍弃数据
re,_:=retangle(2,3)
fmt.Println(re)
//10
注意点:
1.一个函数定义了返回值,必须使用return语句将结果返回给调用处。return后的数据必须和函数定义的一致:个数,类型,顺序
2.可以使用_,来舍弃多余的返回值
3.如果一个函数定义了有函数返回值,那么函数中有分支,循环,那么要保证,无论执行哪个分支,都要有return语句执行
4.如果一个函数没有定义返回值,那么函数中可以使用
return,专门用来结束函数的执行。
全局变量–所有函数都可以使用,而且共享这一份数据
函数的类型
func(参数列表的数据类型)(返回值列表的数据类型)
匿名函数
定义一个匿名函数《直接进行调用。通常只能使用一次,也可以使用匿名函数赋值给某个函数变量,那么就可以多次使用了。
匿名函数:
Go语言是支持函数式编程:
1.将匿名哈桑农户作为另一个函数的参数,回调函数
2.将匿名函数作为另一个函数的返回值,可以形参闭包结构。
func main(){
func (){
fmt.Println("我是一个匿名函数")
}()//直接调用
fun3:=func(){
fmt.Println("我也是一个匿名函数")
}//没有()所以没有进行调用
fun3()
}//我是一个匿名函数
//我也是一个匿名函数
带参数的匿名函数
func(a,b int){
fmt.Println(a,b)
}(1,2)//实参
定义带返回值的匿名函数
func main(){
res1:=func(a,b int)int{
return a+b
}(10,20)//匿名函数调用了,jiangzhixing-结果给res1
fmt.Println(res1)
}//30
高阶函数
函数fun1作为函数fun2的参数,其中fun1叫做回调函数,fun2叫做高阶函数。
func main(){
res1:=add(1,2)
fmt.Println(res1)//3
res2:=oper(10,20,add)
fmt.Println(res2)//30
res3:=oper(5,2,sub)
fmt.Println(res3)//3
res5:=oper(100,8,func(a,b int)int{
if b==0{
fmt.Println("除数不能为0")
return 0
}
return a/b
})
fmt.Println(res5)//12
}
//加法
func add(a.b int)int{
return a+b
}
//减法
func sub(a,b int)int{
return a-b
}
func oper(a,b int,func(int,int)iint)int{
fmt.Println(a,b,fun)//打印三个参数
res:=fun(a,b)
return res
}//参数有匿名函数,根据调用oper时的实参确定调用哪个回调函数,
//即可选择加法还是减法运算
闭包
一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或者外层函数中直接定义的变量),并且该外层函数的返回值就是这个内层函数,这个内层函数和外层函数的局部变量,统称为闭包结构。
func main(){
res1:=incerement()//res1=fun
v1:=res1()
fmt.Println(v1)//1
v2:=res1()
fmt.Println(v2)//2 注意:结果为2.是因为函数fun
//一直没有结束,一直等待调用,其作为返回值不代表自身结束,
//所以i的值一直保存并随着incerement的调用而不断更新
}
func incerement()func()int{//外层函数
//1.定义一个局部变量
i:=0
//2.定义一个匿名函数,给变量自增并返回
fun:=func()int{//内层函数
i++
return i
}
//3.返回该匿名函数
return fun
}
以上是关于函数--Go语言学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量作用域:能够使用变量的代码范围