写点什么

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

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

关注

评论

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

一个不错的开源项目风控引擎(Radar)

Java-fenn

Java

MySQL 如何查找删除重复行

CTO技术共享

腾讯云数据库自研内核全新升级 新架构比原先性能提升20%

Java-fenn

Java

Elasticsearch聚合学习之四:结果排序

程序员欣宸

elasticsearch 9月月更

羊了个羊”通关修改思路

Java-fenn

Java

大数据ELK(三):Lucene全文检索库介绍

Lansonli

9月月更 EKL

Kubernetes 网络排查骨灰级

CTO技术共享

npm,pnpm,yarn,npx的那些事儿

Java-fenn

Java

Cryptocell-712安全引擎概述

Java-fenn

Java

Java进阶(二十三)java中long类型转换为int类型

No Silver Bullet

Java 类型转换 9月月更

COSI:使用 Kubernetes API 管理对象存储

Java-fenn

Java

基于.NET6的简单三层管理系统

Java-fenn

Java

继GitHub的Copilot收费后,亚马逊推出了 CodeWhisperer,感觉不错哟!

Python猫

Python

第四章 C语言之牛客网刷题📖笔记

Dream-Y.ocean

c 算法 9月月更

向量数据库入坑:入门向量数据库 Milvus 的 Docker 工具镜像

Java-fenn

Java

边缘计算技术及其安全

阿泽🧸

边缘计算 9月月更

无限道具教程最新版9.17——大熊G

大熊G

羊了个羊

整理的5种Linux 安装包管理工具

CTO技术共享

pod(一):Kubernetes(k8s)创建pod的两种方式

Java-fenn

Java

终于懂了,RPC和OpenApi的区别

知识浅谈

RPC OpenAPI 9月月更

从 ABAP Netweaver 到 ABAP Platform,我们一直在努力

汪子熙

SAP abap Netweaver 企业级应用 9月月更

【MySQL 进阶】事务二

Aion

MySQL 事务 9月月更 InnoDB存储引擎

高级前端手写面试题

helloworld1024fd

JavaScript 前端

《Java面试考点大全》全网首发,带你摸熟20+互联网公司的面试考点!

收到请回复

Java 云计算 开源 架构 编程语言

阿里、字节、美团我都面了,offer也拿到了,全靠这份Java面试题!

收到请回复

Java 云计算 开源 架构 编程语言

Java 多线程:并发编程的三大特性

Java快了!

Java多线程

Java程序员:为了跳槽刷完1000道真题,没想到老板直接给我升职了!

收到请回复

Java 云计算 开源 架构 编程语言

【C语言】自定义类型(结构体类型+枚举类型+联合体类型)[进阶篇_ 复习专用]

Dream-Y.ocean

c 结构体 9月月更

社招前端一面经典手写面试题集锦

helloworld1024fd

JavaScript 前端

算法、算力、数据,AI落地现在还需要AI工程化

Java-fenn

Java

MyBatis-Plus(三、增删改查)

MySQL MyBatisPlus 9月月更

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