帶讀 |《Go in Action》(中文:Go語言實戰)(一)

LiberHome發表於2022-12-15

個人覺得《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.

相關文章