集体感觉《Go in Action》(中文:Go 语言实战) 相比于《The Go Programming Language》(中文:Go 语言圣经) 要接地气一些,后者很像苏俄的教材,一板一眼,自底向上。前者更像美式教材,一上来就给你一个残缺的“搜寻数据”的我的项目,而后自顶向下,耳濡目染中教你想要的常识。(没有孰优孰劣,相比于大黑书 集体更偏爱 in action 系列,要想学扎实当然 2 本都要看啦)
第一章 Go 语言的介绍
介绍了 Go 的产生的起因,及特点,这方面的文章帖子太多,这里不再赘述。
第二章如何疾速开始一个 Go 程序
这里给出咱们要学习的第一个程序架构:
这一章次要通过对程序的逐行解说,实现了对 json 格局的指标数据进行搜寻的性能。
上面列出一些集体认为值得关注的点:
对于拜访标识符:
和 Java 的 Public/Private 不同 Go 应用首字母大小写标识是否能被其余包中的代码间接拜访。
对于初始化:
0 值的初始化用 var,非零值用:=
对于援用传递 or 值传递
golang 没有援用传递,全是值传递,就算是指针也是值传递(存的是变量的内存地址罢了)
对于闭包:以上面的代码为例
for _, feed := range feeds {
// Retrieve a matcher for the search.
matcher, exists := matchers[feed.Type]
if !exists {matcher = matchers["default"]
}
// Launch the goroutine to perform the search.
go func(matcher Matcher, feed *Feed) {Match(matcher, feed, searchTerm, results)
waitGroup.Done()}(matcher, feed)
}
留神到闭包外面并没有传入 ’waitGroup’,但却胜利拜访到了,并不是因为这个匿名函数拿到了 waitGroup 的正本,而是通过闭包间接拜访到了外层作用域中 waitGroup 变量自身。
对于数据转化:
var feeds = [] * feed
err = json.NewDecoder(file).Decode(&feeds)
return feeds, err
这种性能代码片段其实能够积攒一些,工作中用的挺多的,当然间接应用 unmarshal 也可,因为这里 Decode 就是用 unmarshal 封装的。
参考:Kennedy W , Ketelsen B , Martin E S . Go in action. 2016.