集体感觉《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.