写点什么

书评 —— 《Go 语言编程》

  • 2016-04-19
  • 本文字数:2762 字

    阅读完需:约 9 分钟

由 Alan A. A. Donovan 与 Brian W. Kernighan 共同编著的新书《Go 编程语言》(Go Programming Language)对 Go 这门语言进行了一次精彩的介绍。本书涵盖了包括 Go 语言于 2015 年 8 月所发布的最新稳定版本 1.5 中的内容。读者应当具备类 C 或 Python 风格语言的编程经验,但并不限定于具体某种语言。由于 Go 是一种编译型的类型化语言,因此,具有这方面编程经验的开发者与偏重于脚本语言或非类型语言的开发者相比,这门语言的学习曲线将显得不那么陡峭。

本书的前半部分涵盖了 Go 编程语言的基础,包括源文件的格式与 Unicode 编码、变量、值类型,以及结构体、Map、数组以及 Slice 等等。前半部分的结尾描述了 Go 语言的异常处理机制 Panic 与 Recover。

本书的下半部分专注于在 Go 语言中独树一职的一些特性:不用继承而实现面向对象编程、隐式接口实现,当然还有通过协程(goroutine)实现并发编程。本书的结尾部分讲述了一些实用的打包技巧、如何使用标准的 Go 工具进行测试,以及关于反射及非安全代码的参考。

整本书中所介绍的示例都提供了相应的代码(可在本书的官网上下载),也就是说可以通过以下命令(在Linux 系统上)运行示例代码:

复制代码
$ export GOPATH=$HOME/gobook # choose workspace directory
$ go get gopl.io/ch1/helloworld # fetch, build, install
$ $GOPATH/bin/helloworld # run

对于在其他类型的系统中使用 Go 的读者来说,他们必须对示例代码进行一些调整。比方说要将 GOPATH 的设置方式变为 set GOPATH=“%HOMEPATH%\gobook”,并通过调用 %GOPATH%\bin\helloworld 的方式运行。

本书的第一章(可在本书的官网上免费下载)就表现出了本书的风格,并且在本书的文字之间提供了丰富的示例,这样的风格一直延续到了本书的结尾。

第一章本身的内容进展很快,从如何通过类似于uniq 这样的Unix 工具的实现运行经典的“hello world”示例开始,一直讲到如何生成活动的Lissajous 图形、并通过一个HTTP 服务返回该图形。由于Go 是由Google 推出的语言,因此在网络应用示例部分还介绍了并发式web 爬虫的概念。

虽然第一章名为“指南”,但读者可能会发现略过Lissajous 图形示例(与网络应用示例)或许是种更好的做法,尤其是对于那些没有数学背景的读者来说。好在这些示例仅仅是本书之后将涵盖的内容的一部分样本,等读者阅读到后面这部分时,应该能够更轻松地理解它。当读者对于这门语言有更多的理解之后,这篇指南章节的后半部分应当显得较容易理解。

除了在本书的文字之间提供了大量的示例之外,每一小节通常还为读者提供了大量的练习交由读者完成,因为通过动手实践进行学习的方式比起仅仅通过阅读进行学习更有效得多。在练习之后还提供了大量的挑战内容,要求读者逐步完成更复杂的任务,以加深对这门语言的理解。

本书第二章的开头部分介绍了Go 语言的命名规范,不过对于公共可见的标识符(以大写字母开头)与私有可见的标识符(以小写字母开头)之间的区别没有进行清晰地说明。有经验的Go 语言用户自然了解这一标准,但习惯快速翻阅的读者却很可能会忽略这一细节,而两者所产生的效果的差别直到下一章关于包的部分才会真正讲到。

虽然有些瑕疵,但本书也为读者提供了许多良好的建议,包括如何处理错误(在检测到错误时选择速错,以避免错误的积累),以及如何使用defer 注册用于清理功能的处理函数,这在释放互斥体锁时尤其实用。本书不仅仅只触及了Go 语言的基础内容,整本书到处可见作者的真知灼见。特别值得一提的是如何在Go 的for 循环中处理捕获变量(captured variable),由于变量的作用域所限,必须在内部重新定义一个变量,使它具有一个不同的作用域:

复制代码
for _, dir := range tempDirs() {
dir := dir // NOTE: necessary!
// …
}

本书对于类型、结构体以及函数(function)和方法(method)进行了着重描述,因为这些元素的创建与用法与其他语言有所不同。 本书提到在创建方法时可以指定 Receiver 类型,可选择值类型或是引用类型,并能够在其中使用除 this/self 之外的自定义名称。在使用接口的时候,类型或结构体可以隐式地满足某个接口的定义,对于空的接口类型来说,任何值都可以满足该接口。本书在介绍接口的部分特意涵盖了关于错误的更多细节,因为在 Go 语言中的错误都是以接口的形式表现的。

如果对于这本《Go 编程语言》的评论缺少了 Go 语言中独一无二的特性:协程与管道(channel),它就不能算是一篇完整的书评。本书用了 65 页、即相当于本书 20% 左右的篇幅描述了如何使用协程(异步调用函数)、以及如何通过固定大小(缓冲)的管道或通过异步方式(无缓冲)实现协程之间的相互通信。在介绍如何使用管道发送简单的信号时,本书为读者展示了两种选择,一是将管道的闭包作为一种触发器以执行某些行为,二是通过发送标记符号数据(通常会包括一个布尔值、一个整数值、或仅仅是一个空结构而已)以实现相同的效果。除此之外,本书也展示了如何通过使用多路复用选择器,在多个管道间进行信号的获取或发送。

本书着重强调了使用互斥体(mutex)进行数据保护的重要性,它不仅能够避免数据竞态条件问题,同时也强调了在某些平台中,硬件本身需要在程序中加入一道强闸,以避免出现由于代码顺序被更改或者缓存行的共享造成程序产生不一致结果的问题。本书描述了多种不同的锁机制(例如简单的互斥体或读写锁),并且给出了每种不同实现方式的性能数据对比。

本书所介绍的几个协程为读者展现了如何进行某些场景下的 HTTP 处理,包括来自于多个客户端的网络连接,以及执行多线程的 web 连接的抓取。在这几个章节的结尾部分,作者介绍了一个基于客户端 / 服务器结构的聊天网络的示例,聊天消息可以在多个客户端之间进行路由,并且能够将资源的消耗降至最低。

本书还为读者介绍了如何使用 go get 工具实现包的获取,以及 go test 这个测试工具的使用,此外还介绍了 CPU、内存或互斥体的性能诊断工具。最后,本书对于非安全代码以及反射包进行了简单的介绍,并对于这些特性的应用提出了适当的警告:如无必要,请不要使用他们。

在《Go 编程语言》一书的出版商 Addison Wesley 的网站上可以购买本书的电子版,也可以在分销商那里购买实体书籍。

关于本书作者

Alan Donovan是就职于 Google 基础设施部门的一位主管工程师,专攻软件开发工具。从 2012 年之后,他开始加入 Go 团队,负责静态分析库与工具的设计。他同时也是 oracle godoc-analysis eg 以及 gorename 等工具的作者。

Brian Kernighan在 2000 年之前就职于贝尔实验室的计算机科学研究中心,当时他负责为 Unix 开发语言与工具。他目前在普林斯顿大学的计算机科学系担任教授一职。他同时也是多本技术书籍的合著者之一,包括《C 程序设计语言》以及《程序设计实践》

查看英文原文: Book Review: The Go Programming Language

2016-04-19 18:372738
用户头像

发布了 428 篇内容, 共 177.4 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

在Amazon SageMaker上快速、灵活构建TensorFlow模型的在线推理服务

亚马逊云科技 (Amazon Web Services)

分析

体育锻炼的好处

Tiger

28天写作

轻松搭建数据仓库,与FreeWheel一起“玩转”Amazon EMR

亚马逊云科技 (Amazon Web Services)

分析

Vue.js关于响应式部分的优化

编程江湖

前端开发

2022 年最有前景的 5 个 Web IDE

开源之巅

开发者工具 WebIDE

使用 Amazon Athena 做漏斗分析——实现更高效的数据湖检索

亚马逊云科技 (Amazon Web Services)

分析

Amazon Timestream 在车联网场景的典型应用和性能测试

亚马逊云科技 (Amazon Web Services)

分析

Amazon Redshift ML现已正式推出——使用SQL创建机器学习模型并通过您的数据进行预测

亚马逊云科技 (Amazon Web Services)

分析

​虚幻引擎5更新:头部工作室如何使用Perforce Stream实现虚幻升级

龙智—DevSecOps解决方案

虚幻引擎 虚幻引擎5 UE5

技术分享| 如何快速实现音视频在线通话

anyRTC开发者

音视频 语音通话 视频通话 呼叫邀请 离线推送

在线JSON转toml工具

入门小站

工具

使用Amazon RDS for Oracle配合Oracle Active Data Guard建立托管的灾难恢复与只读副本

亚马逊云科技 (Amazon Web Services)

分析

推出Amazon Kinesis Data Analytics Studio —— 与流数据快速交互

亚马逊云科技 (Amazon Web Services)

分析

Linux之head命令

入门小站

Linux

大数据开发 Spark 模块之SparkSQL

@零度

大数据 spark Sparksql

“你最崇拜的人是谁”,从面试问题看标杆学习法

编程江湖

面试题

模块7作业

panxiaochun

架构实战营

百度智能云实战——静态文件CDN加速

百度Geek说

后端 H5 移动开发

面对持续不断生成的流数据—— Amazon Kinesis Data Analytics 实现及时分析与处理

亚马逊云科技 (Amazon Web Services)

分析

通过Amazon SageMaker与Amazon Step Functions实现机器学习的CI/CD 方案

亚马逊云科技 (Amazon Web Services)

分析

借助Amazon EMR与外部KDC进行身份认证,有效集成业务场景

亚马逊云科技 (Amazon Web Services)

分析

风云叱咤,尚硅谷云原生实战教程(下篇)发布

编程江湖

Java 开发

读《思辨与立场》-08设计你的人生

wood

28天写作 批判性思维 思辨与立场

kafka的JavaAPI操作

编程江湖

大数据

2022 用好这 8 个工具,提升前端工程师软技能

开源之巅

Web 前端开发

通用数据保护条例的监管下,你的数据湖“断舍离”了吗?

亚马逊云科技 (Amazon Web Services)

分析

Go 的 golang.org/x/ 系列包和标准库包有什么区别?

AlwaysBeta

golang Go 语言

如何摆脱机房教师控制?

喀拉峻

网络安全 安全 信息安全 计算机

使用 Python Poetry 进行依赖管理

华为云开发者联盟

Python Python Poetry 依赖项管理 Poetry

外贸订单回暖,集装箱持续爆舱,低代码或将成外贸行业新财富密码

优秀

低代码 外贸管理

直播预告丨和我们一起过圣诞吧!Hackathon 创意攻略等你查收

PingCAP

书评 —— 《Go语言编程》_Book Review_Alex Blewitt_InfoQ精选文章