(译)Go|(译)Go 语言中的闭包
【(译)Go|(译)Go 语言中的闭包】原文链接:Special Memory Powers of Go Closures通常 Go 语言中的命名函数只能在包级别定义,但是为了方便广大 Gopher,Go 语言允许 function literal 在任何表达式中表示一个函数。
那么 function literal 是什么呢?它就是没有名字的函数体。这些匿名函数与 JavaScript 领域内的函数是一样的。
-
文章图片
image.png
-
文章图片
image.png
这与 Go 的预言正好相符:函数是引用类型,函数的值是不可以进行比较的。
匿名函数是可以保存它们局部变量状态的,并且还可以访问或更改包裹它的函数的局部变量。
保存变量状态这个属性有助于我们解决很多计算机科学中的问题,例如:拓扑排序一下一个全栈开发工程师的技能树
//topological sortpackage mainimport (
"fmt"
"sort"
)var pathOfFullstack = map[string][]string{
"fullstack developer": {"C#", "Python", "Go", "Angular", "React"},
"C#":{"C"},
"Angular": {"html", "Css", "Javascript"},
"Go":{"C#", "Python"},
"React":{"html", "Javascript", "JSX"},
}func main() {
for i, path := range topoSort(pathOfFullstack) {
fmt.Printf("%d:\t%s\n", i+1, path)
}
}func topoSort(m map[string][]string) []string {
var pathOrder []string
visited := make(map[string]bool)
var visitAll func(items []string)
visitAll = func(items []string) {
for _, item := range items {
if !visited[item] {
visited[item] = true
visitAll(m[item])
pathOrder = append(pathOrder, item)
}
}
}
var paths []string
for devPath := range m {
paths = append(paths, devPath)
}
sort.Strings(paths)
visitAll(paths)
return pathOrder
}// Output
/*
1:html
2:Css
3:Javascript
4:Angular
5:C
6:C#
7:Python
8:Go
9:JSX
10: React
11: fullstack developer
*/
所以下一次你定义 API,就可以施展一下你自己的 Go 语言闭包了。
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 【译】20个更有效地使用谷歌搜索的技巧
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 放下心中的偶像包袱吧
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗