golang 入门(四) 函数、匿名函数、闭包
原创
©著作权归作者所有:来自51CTO博客作者hellowgw的原创作品,请联系作者获取转载授权,否则将追究法律责任
函数是逻辑代码块的组织形式,在python和golang中都存在。实现的方式也是类似的。
python中的函数
def inforecord(m):
if m["os"] == "linux":
# 变量随用随写,不需提前声明
msg = "Linux User"
else:
msg = "Another User"
return msg
info = {
"os": "linux",
"network": "huawei",
"program": "golang",
}
ret = inforecord(info)
print(ret)
运行结果
python test.py
Linux User
Process finished with exit code 0
在golang中实现
package main
import "fmt"
// 函数名称 传参名称及参数明确的数据类型 返回值类型
func InfoRecord(m map[string]string) string {
// 必须先声明再使用
var msg string
if m["os"] == "linux" {
msg = "Linux User"
} else {
msg = "Another User"
}
return msg
}
func main() {
info := map[string]string{
"os": "linux",
"network": "huawei",
"program": "golang",
}
ret := InfoRecord(info)
fmt.Println(ret)
}
运行结果
% go run main.go
Linux User
与python不同的是,golang的函数支持多个返回值
package main
import "fmt"
func InfoRecord(m map[string]string) (string, string) {
//多个返回值的类型都在括号里注明
// 必须先声明再使用
var msg string
if m["os"] == "linux" {
msg = "Linux User"
} else {
msg = "Another User"
}
return msg, m["program"]
}
func main() {
info := map[string]string{
"os": "linux",
"network": "huawei",
"program": "golang",
}
message, prog := InfoRecord(info)
fmt.Println(message, prog)
}
运行结果
% go run main.go
Linux User golang
匿名函数
从名称即知,即时写一个临时函数并且马上执行,这个临时函数没有命名而已。
package main
import "fmt"
func main() {
//方法一 将匿名函数直接赋值给一个变量
Myfunc := func(name string) {
fmt.Printf("%s 通过赋值方式运行匿名函数\n", name)
}
// 变量名称后加一个括号"()"执行函数,相当于命名函数换了一个写法
Myfunc("wgw")
//方法二 即时定义一个函数,即时执行
func(name string) {
fmt.Printf("%s 直接运行匿名函数\n", name)
}("wgw")
// 直接在函数后面再加一个括号"()"并传入参数,直接运行
}
运行结果
% go run main.go
wgw 通过赋值方式运行匿名函数
wgw 直接运行匿名函数
闭包
闭包函数指的是函数中用到的某个变量,并不是通过括号"()"方式传入的,而是通过通过函数外的局部或全局变量提供的。
说起来挺绕的,代码实现案例如下:
package main
import "fmt"
// 函数Info的返回值是一个匿名的闭包函数,第一层是func(string) 第二层是string
func Info(age int) func(string) string {
fmt.Println("外部变量是 age 的值是 ", age)
// 外层函数的返回值 是一个匿名函数
return func(name string) string {
// 匿名函数中的age参数来自于外层变量
msg := fmt.Sprintf("姓名: %s, 年龄: %d\n", name, age)
return msg
}
}
func main() {
// 运行外层函数,返回值是匿名函数
// 相当于赋值型的匿名函数,info := func(a string) string {return a}
info := Info(16)
// 运行闭包函数
m := info("wgw")
fmt.Println(m)
}
执行结果
% go run main.go
外部变量是 age 的值是 16
姓名: wgw, 年龄: 16
总结:
- golang的函数声明也是一如既往的严格,要明确告知函数传入的参数值的具体数据类型以及函数的返回值类型。这在协同开发大型程序或交接别人代码的时候非常有用,所有的输入输出数据一目了然。
- golang的函数支持多个返回值
- 开发经验有限,必须使用闭包函数的需求场景还没真的遇到过