集体感觉《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 = [] * feederr = json.NewDecoder(file).Decode(&feeds)return feeds, err
这种性能代码片段其实能够积攒一些,工作中用的挺多的,当然间接应用unmarshal也可,因为这里Decode就是用unmarshal封装的。
参考:Kennedy W , Ketelsen B , Martin E S . Go in action. 2016.