4

个人觉得《Go in Action》(中文:Go语言实战)相比于《The Go Programming Language》(中文:Go语言圣经)要接地气一些,后者很像苏俄的教材,一板一眼,自底向上 。前者更像美式教材,一上来就给你一个完整的“搜索数据”的项目,然后自顶向下,潜移默化中教你想要的知识。(没有孰优孰劣,相比于大黑书 我觉得先看 in action 系列,带着问题再去看大黑书效果更好)


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封装的。


LiberHome
409 声望1.1k 粉丝

有问题 欢迎发邮件 📩 liberhome@163.com