个人觉得《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封装的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。