個人覺得《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封裝的。