1、函数变量
一上来乍一看,函数变量?这究竟是什么意思呢?你函数就函数,变量便是变量,这两者搞在一块,到底是几个意思呢?
其实啊,在Go
当中,函数
也是一种类型,既然是类型,那就可以向其它类型一样,给变量定义类型啊!而这个类型是函数
,所以函数类型
定义出来的变量可不就是函数变量
吗!
package main
import (
"fmt"
)
func site() {
fmt.Println("秋码记录:https://qiucode.cn")
}
func main() {
//声明一个函数变量 qiucode
var qiucode func()
//将自定义 site 函数赋值给 函数变量 qiucode
qiucode = site
//调用 qiucode() 就相当于调用了 site()
qiucode()
}
2、匿名函数
说到匿名函数,想必有过Java
、PHP
以及Python
等面向对象编程语言的经验,对匿名函数
并不陌生吧!而在Go
也是有匿名函数
的哦,在前面我们谈到了匿名变量(_)
。
package main
import (
"fmt"
)
func main() {
//声明一个匿名函数并自调用
func(name string) {
fmt.Println("秋码记录:", name)
}("https://qiucode.cn")
//声明一个匿名函数 并赋值给一个变量
note := func(desc string) {
fmt.Println(desc)
}
//通过进行匿名函数的调用
note("仗剑行于江湖,执笔记江湖事")
}
匿名函数
的用处还是很广泛的,它可以在作为一个函数的形参,而后进行回掉函数
。
package main
import (
"fmt"
)
func webSite(list []string, callBack func(string)) {
for _, val := range list {
callBack(val)
}
}
func main() {
webSite([]string{"秋码记录", "https://qiucode.cn", "仗剑行于江湖,执笔记江湖事"}, func(str string) {
fmt.Println(str)
})
}
其实,匿名函数
还可以对某些操作进行封装。
package main
import (
"flag"
"fmt"
)
//从命令行输入值 --qiucode=输入的值
var qiucodeParam = flag.String("qiucode", "", "qiucode to perform")
func main() {
//解析完成,将指针变量 qiucodeParam 指向命令行输入的值
flag.Parse()
//定义一个 map 键是 string 类型 值是 func
var qiucode = map[string]func(){
"qiuma": func() {
fmt.Println("秋码记录")
},
"qiucode": func() {
fmt.Println("https://qiucode.cn")
},
"world": func() {
fmt.Println("有人的地方,就是江湖!")
},
}
//指针变量指向命令行传入的值 在 map 查找命令行输入的字符串 是否存在在该 map 中
//如果存在 就回调该 键 所对应的值 也就是 函数
if fun, flag := qiucode[*qiucodeParam]; flag {
fun()
} else {
fmt.Println("qiucode not found")
}
}