编程熟手入门Go语言
2018年看完的第一本书,《Introducing Go》是一本介绍 Go 语言的书,针对人群是已经有编程经验的读者。全书,算上封面、目录、附录、索引,总共才 124 页,实际阅读时间(包括手打一遍示例代码并完成每章后面的习题),不到15个小时。我是一次一小时左右断断续续看完的,但是需要的话,完全可以在一个周末看完。 总体评价是短小精悍,有编程经验的读者入门 Go 语言的理想书籍。
2018年看完的第一本书,《Introducing Go》是一本介绍 Go 语言的书,针对人群是已经有编程经验的读者。全书,算上封面、目录、附录、索引,总共才 124 页,实际阅读时间(包括手打一遍示例代码并完成每章后面的习题),不到15个小时。我是一次一小时左右断断续续看完的,但是需要的话,完全可以在一个周末看完。
总体评价是短小精悍,有编程经验的读者入门 Go 语言的理想书籍。
书籍内容
本书章节安排非常主流,第一章介绍背景、开发环境、编辑器配置,第二三章介绍简单类型和变量,第四章讲控制结构,第五章讲复杂类型,第六章讲函数,第七章讲结构体和接口,第八章讲包,第九章讲测试,第十章讲并发,十一章介绍进一步学习的方向和参考资料。
Go 语言的类型与 C 语言非常相似,不过浮点数用 float32 和 float64。排除别名的话,按前缀 int uint float complex 分类非常清晰。其中 complex 是复数,同时字符串也纳入了基本类型,不再是“字符的数组”,虽然也许本质还是如此。
Go 语言是强类型语言,但变量支持类型推导,定义的时候不必明确指定类型,编译器会根据初始值推断类型。未明确赋初始值的变量,其值也不再像 C 语言是随机的。作用域的规则和 C 相同。
Go 的控制结构非常精简,循环只有 for ,取消了 while until 等关键字,所有功能并入 for 中,同时 for 也兼具了部分语言的 foreach 功能,可以在循环时直接把键和值都取出来。if 没什么特别的好讲,switch 比较特殊,不需要 break ,因为默认就不会“穿透”到下一个条件。另外一点就是在表现形式上,紧跟在 for if switch 后面的内容都不再需要括号。
再接下来讲到 Array, Slice 和 Map,Slice 可以简单理解成动态长度的数组,Map 是键值对,键和值的类型都可以自行定义。同时也内置了不少方法来简化它们的使用。这些内容的引入,使 Go 相对 C 来说,明显更“现代”了。
Go 语言的函数使得返回多个变量更加方便,同时函数也像 JavaScript 中一样,可以赋值给一个变量,既可以作为参数进行传递,也可以作为返回值。这样一来,实现闭包就非常方便了。panic 和 recover 则提供了异常处理功能。Go 语言中也可以使用指针,但是由于函数已经能方便的返回多个值,指针的主要发挥空间,可能就在于节约内存,提高性能方面了。
结构体 Struct 是又一个和 C 语言对应的概念,一个结构体可以有多个字段,每个字段可以是不同类型,非常适合与数据库的一条记录对应。和 C 语言单纯用来存储数据的结构体不同,Go 的结构体更像是面向对象编程语言中的类,可以有自己的方法,但是这样一来就定下了一个基调,数据是根本,方法围绕数据展开工作。结构体中的字段也可以是另一个结构体,就这两点而言和 JavaScript 中的对象更加接近。Go 还为结构体引入了接口 Interface 概念,这个概念一般也是被用在面向对象语言中,接口的引入使具备同名方法的不同结构体能被统一使用。
现代编程语言都有自己的包和包管理工具,Go 也是如此,首先就像 C 语言有标准库,Go 自带大量核心包,包括输入输出、文件和目录读写等基本功能,也包括列表等复杂结构、哈希及加密算法、TCP HTTP RPC 网络操作。通过 import 关键字,就可以引入 Go 的核心包或者第三方包。最后介绍了如何创建自己的包,在这一节提到了如何用 godoc 命令快速给自己的包编写文档,和后文的 test 命令一起,体现出了 Go 语言的体系是非常完整的,在核心功能中,就为这些东西定义了标准的方法。这样一来 Go 语言就不容易像其他语言一样,在官方未定义的刚需领域,出现多种互不兼容的解决方案分散社区的精力。
Go 语言内置了 testing 包,用于测试,通过 go test 命令即可执行写好的测试代码。测试文件的文件名都以 _test 结尾,函数名都是以 Test 开头,又一次体现了其约定优于配置的设计思想。
第十章介绍了并发,是 Go 语言的一大宣传亮点,在代码中,通过 go 关键字执行一个函数,那个函数就可以在一个独立进程中运行,我想已经没有比这更简单的并发方案了。进程之间通信,通过 Channels 进行,一个进程监听,另一个进程发送,就完成了数据在进程间的传递。监听和发送都使用了 <-
操作符来进行,非常简洁,又非常形象和直观。
总结
Go 语言堪称完美,和 C 语言一样极简、精确、标准、高效,基础功能更强大、更现代,并在便利性上大大超过 C 语言,接近了 JavaScript 这样的动态语言。核心功能非常完善,文档和测试也被考虑在内,甚至编辑器插件也非常到位,能将代码格式标准化,避免用户代码风格不同导致的精力分散。
Introducing Go 这本书,也和 Go 语言一样,没有半句废话,却涵盖了 Go 语言的方方面面,各章节点到即止(毕竟平均算下来,每章分到的篇幅不足 10 页,其中还有 1 页是习题)。因此阅读这本书,首先要求读者有一定的编程经验,最好是多种语言的经验,和自己熟悉的语言相互验证参照,才能更好理解书中内容。这样的安排,不浪费大家时间,作者的工作主要就是给读者一份地图,不至于在刚入门时两眼一抹黑,像个无头苍蝇。一方面对 Go 语言建立一个整体的了解,另一方面要针对具体功能点查资料时,就有了线索和关键字,至于在一条具体的路上要走多远或能走多远,就全看读者自己了。