书评 —— 《Go语言编程》

由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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言哈夫曼压缩文本,哈夫曼文本压缩C语言实现.doc

/*文件中有些参数定义的比较大,主要是为了适应较大文件的压缩*/#include#include#include#include//用以删除多余的中间文件#define M 100000000000//最大字符数int op,co[100];//编码表的扫描指针,简易栈co[]typedef struct Hfnode //哈弗曼树结点类型{…

labview随机数序列_labview产生随机数

熟悉 LabVIEW 环境。 环境。 2. 创建一个 VI。 。 发生一个值为 0.0~1.0 的随机数 a,放大 10 倍后与某一常数 b ~, 比较, 比较,若 a>b,则指示......5-12 前面板中建立量表的显示控件,然后右键创建属性节点中的滑块颜色前景色,程序框 图中用一随机数乘…

thinkphp单入口和多入口的访问方法

完全是参考thinkphp的官网资料 现在, 基本上都是 用 单入口 的方式来做的! thinkphp可创建多入口和单入口两种模式,本文主要讲解创建方法和两者的区别。 TP版本:3.1.3 前端:Home,后台:Admin 一. 创建方法 单入口&#…

git菜单形式的_添加“Git Bash Here”到右键菜单

之前安装了git的时候,清晰的记得右键菜单里是有“Git Bash Here”这个选项的,非常方面。后来不知道为啥突然没有了,就像搞回来。创建步骤打开注册表,定位到HKEY_CLASSES_ROOT\Directory\Background\shell(如果Background下面没有s…

c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化

前言Flutter 中没有类似于 Java 中 Gson/Jackson 这样的 JSON 序列化库。因为这些库都是通过反射实现的,而 Flutter 中不支持反射。其实 Dart 是支持反射的,只是 Flutter 禁用了而已。Flutter 在 release 版本中会去除没有使用的代码,优化包大…

python相关函数_python列表相关函数

1、python中可用于列表的函数 (1)cmp(list1, list2)  比较两个列表的元素 (2)len(list)  列表元素个数 (3)max(list)  返回列表元素最大值 (4)min(list)  返回列表元素最小值…

财务模块的一些基础概念

财务会计承担着企业总体信息管理和传递的职能,无论企业采用何种运营模式、经营何种业务,都离不开财务的支持,大多数运营和管理流程均与财务存在着接口,为此,优化、高效的财务运作模式和流程成为确保企业良性发展和业务…

if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...

前言这是 mybatis 比较常问到的面试题,我自己在以前的面试过程中被问到了2次,2次都是非常重要的面试环节,因此自己印象很深刻。这个题目我很早就深入学习了,但是一直没有整理出来,刚好最近一段时间由于工作太忙&#x…

多机器使用setnx 设置同一个key_Redisson分布式锁的简单使用

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!一:前言我在实际环境中遇到了这样一种问题,分布式生成id的问题!因为业务逻辑的问题,我有个生成id的方法,是根据…

java学习笔记3--类与对象的基础

1、面向对象的程序设计方法概述 面向对象的程序设计 与结构化程序设计方法相比,更符合人类认识现实世界的思维方式,已成为程序设计的主流方向 涉及的主要概念:抽象、封装、继承、多态 对象 现实世界中:万物皆对象,都具…

孟德尔随机化周报 (12.14)

欢迎报名2023年郑老师团队课程! 郑老师科研统计培训,包括临床数据、公共数据分析课程等,欢迎报名 孟德尔随机化,Mendilian Randomization,简写为MR,是一种在流行病学领域应用广泛的一种实验设计方法,利用公…

android计算器弹窗,android实现简易计算器

本文实例为大家分享了android实现简易计算器展示的具体代码,供大家参考,具体内容如下效果图:一、如图,首先布局计算器主页显示activity_main.xmlxmlns:tools"http://schemas.android.com/tools"android:layout_width&qu…

多选取值_机制砂如何控制MB值和石粉含量

随着环保政策的加强和河沙采挖禁令的收紧,机制砂逐渐成为建筑用砂的主流。但很多砂石厂生产设备落后、生产条件简陋、生产工艺不完善导致生产的机制砂品质低,质量不能满足高等级混凝土的要求。不仅卖不上价格,还浪费了矿石资源,挣…

python爬虫哪个选择器好用_Python网络爬虫四大选择器用法原理总结

前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。今天小编来给大家总结一下这四个选择器,让大家更加深刻的理解和熟悉Python选择器。 一、正则表达式 正则表达式为我们提供了…

C++primer习题--第3章

【习题 2.11】 编写程序&#xff0c;要求用户输入两个数——底数&#xff08; base&#xff09;和指数&#xff08; exponent&#xff09;&#xff0c;输出底数的指数次方的结果。 #include <iostream> #include <math.h> #include <string> using namespace…

eclipse配置python开发环境_eclipse怎样搭建Python开发环境

eclipse通过pydev插件也是可以搭建出Python开发环境的。今天小编我就来给大家分享一下eclipse怎样搭建Python开发环境的经验哦。 工具/原料 电脑 eclipse Python pydev插件链接&#xff1a;https://pan.baidu.com/s/1VIK5H_ZbC6DsOlNwy2OwLw 密码&#xff1a;kg8a 方法/步骤 1 …

android光照传感器,详解 android 光线传感器 light sensor的使用

调用anroid的光线传感器使用。实现效果图&#xff1a;MainActivity.Javapackage hk.ust.cse.comp107x.ligthsensor;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import …

hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

全文由下面几个部分组成&#xff1a;先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释&#xff0c;以及拉链表和常用的切片表的区别。举一个具体的应用场景&#xff0c;来设计并实现一份拉链表&#xff0c;最后并通过一些例子说明如何使用…

算法导论:堆排序

堆 堆是一个数组&#xff0c;它可以被看成一个近似的完全二叉树&#xff0c;树上的每一个结点对应数组中的一个元素。除去最底层外&#xff0c;该树是完全充满的&#xff0c;而且从左到右填充。 用数组A表示堆&#xff0c;从数组第1个元素开始&#xff0c;数组中第i&#xff08…