最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

书评 —— 《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:372620
用户头像

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

关注

评论

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

iOS 面试策略之算法基础6-7节

iOSer

ios 面试 算法 ios开发 算法解析

skywalking dubbo agent 分析

kaiwen

我是如何开始写作的

happlyfox

个人成长 4月日更 1 周年盛典

用知识点+实例+项目完全深入地讲解springboot原理,这份《springboot实战派》火了!

Java架构之路

Java 程序员 架构 面试 编程语言

toB SaaS会成为苏州下⼀个“⼀号产业”么?

龙归科技

数字化 tob

anyHouse-iOS 高仿ClubHouse

anyRTC开发者

ios 音视频 WebRTC RTC 语音通话

MySQL 表列数和行大小有哪些限制?

码农架构

MySQL 运维

第一课作业纠正

杰语

⼤规模短⽂本聚类的设计和实践

百度Geek说

聚类 query 内聚

会议更流畅,表情更生动!视频生成编码 VS 国际最新 VVC 标准

阿里云视频云

阿里云 视频压缩 VVC

想要写优秀的设计测试用例,不懂这个可不行!

程序员阿沐

软件测试 自动化测试 测试开发 测试用例 测试工程师

企业架构设计方法TOGAF介绍

joinM

企业架构 技术架构 业务架构 TOGAF 技术与业务

阿里资深技术专家崮德:如何成就更好的自己

阿里巴巴中间件

留存率计算

Flychen

DBA 行业是否将会消亡?

BinTools图尔兹

运维 dba 数据库管理工具

pdf.js使用小结

空城机

大前端 4月日更 pdf.js

联盟链技术

360技术

用户故事是垂直的切片(译)

Bruce Talk

敏捷 译文 Agile User Story

国产监控夜莺v4来了,大幅降低部署维护难度

龙渊秦五

Nightingale 滴滴夜莺

如何打造高效技术团队|专访前美篇首席架构师张超

穿过生命散发芬芳

调查采访能力考核

Disruptor 源码解读

lich0079

Java volatile Disruptor CAS Concurrent

双非渣硕!四面阿里收到offer后,才发现学长给的面试笔记有多强大

Java 编程 程序员 面试 计算机

Spring Boot 2.0 实现优雅停机

U2647

Spring Boot 4月日更

罗美琪和春波特的故事...

阿里巴巴云原生

容器 开发者 云原生 开发工具 消息中间件

Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩

阿里巴巴云原生

大数据 容器 云原生 监控 弹性计算

当时尚撞上区块链,为潮酷创意赋予专属“ID”

旺链科技

产业链

Android Crash监控方式

Darren

监控 异常检测 Android开发 NativeCrash

灰度发布系统架构设计

xcbeyond

微服务 灰度发布 4月日更

中寰-卜钢-采访提纲:车联网行业发展趋势

马踏飞机747

采访

Spring Boot 两行代码轻松实现国际化

Java架构师迁哥

混合云安全简史

龙归科技

混合云

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