一篇文章带你清楚Go语言基础之函数
发布时间:2021-11-04 02:51:08 所属栏目:语言 来源:互联网
导读:上次主要回顾 上述我们知道,定义一个函数,可以将函数内存分配理解如下。 同时我们也知道,无论进行什么操作,只会操作栈上面的值。 函数和变量 函数名即变量 不知道你想过没,定义一个变量,接收一个函数,就像这样。 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))
}
至于上述两个的功能,恕小生不才,至今用到的场景不多。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |