golang函数
一、golang函数是什么
封装特定功能代码块,主要是提高了代码的复用性,用关键字fun来定义。go语言支持匿名函数和闭包。
二、golang函数使用
1.定义,使用函数
代码说明如下(示例):
package main
import "fmt"
/*
func 函数名(参数)(返回值){
函数体
return 返回值1,返回值2....
}
函数名:非数字开头,字母、数字、下划线组成,在同一个包函数名不能重复
参数:无参,多参,可变参,可以是任意类型,包括函数
返回值:无,一个,多个
*/
//1a.定义普通函数
//func sum_func (x int,y int )int 参数类型相同是可以如下简写,可以返回多个值
func sum_func (x,y int )int{
sum:=x+y
return sum
}
//2b可变参数演示,可变参数的类型必须相同,可变参数类型是切片
func sum_variable_arguments_func (args ...int ){
fmt.Printf("%v--%T\n",args,args)//[1 2 3 4]--[]int
}
//3c自定义函数类型,使用关键字type来定义: type 函数类型名 func(int,int) int
type type_func func(int,int) int
func sub_func (x,y int )int{
sub:=x-y
return sub
}
func func_in_arguments(x,y int,tf type_func)int{
return tf(x,y)
}
//4d函数返回值
func func_return(x,y int,tf type_func)(type_func,int){
return tf,x+y
}
//5e递归调用
func fn(n int){
if n>0 {
n--
fmt.Printf("递归调用值:%v\n",n)
fn(n)
}
}
//6f全局变量,局部变量,闭包:是指有权限访问另一个函数作用域中的变量的函数.闭包的变量不会立即回收,非必要不使用
var a int=10
func colse_package() func(y int) int{
var i=10//局部变量
return func(y int) int {
i+=y
return i
}
}
func main(){
//1a.普通函数调用
sum_return:=sum_func(2,5)
fmt.Printf("返回值是:%v\n",sum_return)//返回值是:7
//2b调用,也可以是无返回值
sum_variable_arguments_func(1,2,3,4)
//3c函数类型的调用
var c type_func
c=sum_func//指定类型
fmt.Printf("c的类型:%T\n", c)//c的类型:main.type_func
f:=sum_func//类型推导为func类型
fmt.Printf("f的类型:%T\n", f)//f的类型:func(int, int) (int, int)
//类型需要转换的情况
type myint int
var b myint=20
var a int=10
fmt.Printf("b的类型是:%T,%v\n",b,a+int(b))//b的类型是:main.myint,30
//3c-1a函数作为参数来调用,相当于是函数式接口
sum_return_1:= func_in_arguments(5, 1, sum_func)
fmt.Printf("sum_return_1返回值是:%v\n",sum_return_1)//sum_return_1返回值是:6
sub_return_1:= func_in_arguments(5, 1, sub_func)
fmt.Printf("sub_return_1返回值是:%v\n",sub_return_1)//sub_return_1返回值是:4
//函数不可以嵌套定义函数,可以用匿名函数来解决相关问题
func(){
}()
j:=func(x,y int)int{
return x*y
}(2,3)
fmt.Printf("j返回值是:%v\n",j)//j返回值是:6
//匿名函数当作参数使用
aguments:=func_in_arguments(5,6,func(x,y int)int{
return x*y
})
fmt.Printf("aguments返回值是:%v\n",aguments)//aguments返回值是:30
//4d函数的返回值,可以有多个返回值,返回值可以是函数
ruturn_func,sum:=func_return(2,3,sub_func)
fmt.Printf("返回函数值为:%T,%v,%v\n",ruturn_func,ruturn_func(4,5),sum)//返回函数值为:main.type_func,-1,5
//5e函数的递归调用,一定要注意纵深和临界值,否则进入死循环
fn(10)
//6f全局变量,局部变量,闭包。
// 全局变量特点:常驻内存,污染全局;局部变量:不常驻内存,不污染全局;闭包:常驻内存,不污染全局
if flag :=true; flag {
fmt.Printf("局部变量:%v\n",flag)//局部变量:true
}
cp:=colse_package()
fmt.Printf("%v\n",cp(10))//20
fmt.Printf("%v\n",cp(10))//30
fmt.Printf("%v\n",cp(10))//40
}