一篇文章带你清楚Go语言基础之函数
发布时间:2021-11-03 22:33:31  所属栏目:语言  来源:互联网 
            导读:上次主要回顾 上述我们知道,定义一个函数,可以将函数内存分配理解如下。 同时我们也知道,无论进行什么操作,只会操作栈上面的值。 函数和变量 函数名即变量 不知道你想过没,定义一个变量,接收一个函数,就像这样。 package main import fmt func say()
                
                
                
            | 上次主要回顾
	上述我们知道,定义一个函数,可以将函数内存分配理解如下。
	 
	 
	 
	同时我们也知道,无论进行什么操作,只会操作栈上面的值。
	 
	函数和变量
	函数名即变量
	不知道你想过没,定义一个变量,接收一个函数,就像这样。
	 
	package main 
	 
	import "fmt" 
	 
	func say() { 
	    fmt.Println("say") 
	} 
	 
	func main() { 
	    var s1 = say 
	    s1() 
	} 
	执行结果如下。
	 
	 
	 
	可以发现,通过一个变量接收一个函数名,在通过变量名+括号执行,是没有问题的。
	 
	那么,这个变量是什么类型的呢???
	 
	fmt.Printf("%Tn",s1) 
	执行结果
	 
	 
	 
	如果我将say函数改一下呢?
	 
	func say(s int) int{ 
	    fmt.Println("say") 
	    return 1 
	} 
	fmt.Printf("%Tn",s1) 
	 
	 
	可以发现,如果函数参数和返回值不一样,打印出来的类型也是不一样的。
	 
	定义函数类型
	上述我们知道,可以通过变量接收一个函数名。
	 
	通过变量接收函数名是没有约束的,不管函数几个参数,几个返回值,都可以接收,真是活出了动态语言的样子。
	 
	而定义函数类型就是限制变量接收函数,只能接收指定格式的函数。
	 
	主要用到type关键字。
	 
	格式
	 
	type 变量名 func([参数类型,参数类型]) [返回值类型] 
	 
	中括号表示可选参数 
	例如
	 
	type a func() 
	type b func(int) 
	type a func(int,int) int 
	具体代码
	 
	package main 
	 
	import "fmt" 
	 
	/* 
	    定义一个函数类型的变量 
	    接收的函数参数必须是两个int类型 
	    函数的返回值也必须是int类型 
	*/ 
	type cType func(int, int) int 
	 
	func say1(a, b int) int { 
	    fmt.Println("say",a+b) 
	    return 1 
	} 
	func say2(a, b int) { 
	    fmt.Println("say") 
	 
	} 
	func main() { 
	    var s1 cType 
	    s1 = say1//调用s1其实调用的就是say1 
	    s1(1,1) 
	 
	    //var s2 cType 
	    //s2 = say2//报错,cannot use say2 (type func(int, int)) as type cType in assignment 
	} 
	高阶函数
	千万不要被这个名字唬住了。
	 
	简单点说,高阶函数就是把函数当作参数或者把函数当作返回值。
	 
	函数当作参数
	package main 
	 
	import "fmt" 
	 
	func add(x int, y int) int { 
	    return x + y 
	} 
	func calc(x int, y int, other func(int, int) int) int { 
	    return other(x, y) 
	} 
	func main() { 
	    //将add函数传入第三个参数 
	    var result = calc(34, 12, add) 
	    fmt.Println(result) 
	} 
	函数当作返回值
	package main 
	 
	import "fmt" 
	 
	func add(x int, y int) int { 
	  return x + y 
	} 
	func test() (func(int, int) int) { 
	  return add 
	} 
	func main() { 
	  var a = test() 
	  fmt.Println(a(1,2)) 
	} 
	至于上述两个的功能,恕小生不才,至今用到的场景不多。 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 

