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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值