写点什么

《Go 语言实战》内容回顾与作者采访

2016 年 2 月 15 日

Go 语言实战 是曼宁新出版的一本技术书籍,目标是提供一个全面介绍 Go 语言的教程。内容包括语法介绍和内部实现,以及最常见的用法。InforQ 借机采访做本书的作者:William Kennedy。

一如曼宁的“实战”系列,Go 语言实战秉承了以精简的体积容纳第一手的信息和深入语言内部的洞见。作者对于本书的定位是,拥有一定编程经验但原来并没有 Go 的基础的中级开发者。

从而,本书的作者们热衷于提供非常清晰的且对每个概念的细节解释,所介绍的内容确保读者能够拥有必要的信息以全面的理解到位。关于此一个极为妥当的例子就是关于讨论 Go 的内建数据类型-数组、切片和映射-在那里读者不仅可以学习到如何使用它们,而且可了解它们是如何实现的,以及什么样的情形下使用何种类型,举例来说,什么时候切片或者什么时候用到切片的切片。对于有经验的 Go 的开发者,此书亦有颇大的吸引力,当然这在书中的最后几个章节才有所体现,最后覆盖了一些高级的主题如常见的并发模式、剖析、调试、以及性能调优。

本书有 9 章的内容,它们分别是:

  • 解释 Go 是什么,且提供了短小但完整的程序(章节 1 和 2);
  • 介绍了包管理的概念,探讨了项目的组织方式,以及 Go 所提供的工具(章节 3);
  • 描述了一些 Go 内置的数据类型的细节,以及 Go 的类系统,包括接口和类型嵌入,Go 对于 C++ 虚拟和非虚拟继承的另外一种方法。类型嵌入可以看作是自动化成份或委托的形式,嵌入的类型接口会自动通过嵌入类型抛出。接口提供了运行时的多态。(章节 4);
  • 探索了 Go 的并发原语:goroutines,即允许在轻量级进程内部执行一个函数;频道,即支持类型安全、在协程之间进行同步通信。除了 goroutines 和频道之外,Go 还支持内存共享和传统的锁原语。此外,一些高级的并发模式有基于频道实现的看门狗,用来管理池的资源和掌管池中的工作者(章节 6 和 7);
  • 介绍了 Go 的标准库,聚焦于三个包:logjson、和io(章节 8);
  • 向读者展示了使用测试和基准工具,在文档中如何添加示例代码然后用它们来做测试(章节 9)。

Go 语言实战包涵了超过 100 个的代码实例,其中很多是从标准库中提取出来的,所以用户可以理解为此书提供了实际的例子,即 Go 是如何解决常见问题的。

InfoQ 采访了《Go 语言实战》的主要作者,William Kennedy。

InfoQ: 您能解释下写作此书的主要动机是什么吗?有此必要吗?

我早些时候写的博客就是作为 Go 的初学者学习的地方。我尝试去做到读者并不是超出基础知识水平的。当我被邀请参与此书的写作时,我将之视为能够在更大范围内继续我的认知。在本书写作时,市面上只有两本书出版了,而且它们正在变的过时。我在当初学习 Go 的时候读过这两本书,所以自我感觉以我的风格写就的书可以带来完全不同的视角。
2 年过去了,我认为素材很好的覆盖了一些不同的格式和书籍。我认为 Donovan 和 Kernighan 的 Go 编程语言和《Go 语言实战》是今天学习 Go 语言的机制、实现、规范最好的两本书。

InfoQ: 您的书的目标读者是有一些编程经验的中级开发者,当他们阅读此书时您有什么建议?什么是他们应该期望的?什么不应该期望?

这很难回答,但是最为重要的事情就是任何开始要学习 Go 的人应该持一种全新的眼光去看待 Go。你学习 Go 就应该去按照此语言的所设计的思路去写代码。约定俗成的东西至关重要,这没什么好说的。如果你能做到由语言团队和社区所共同遵守的约定俗成的去写代码,就会事半功倍。如果你非得对着干,也可能让程序运行起来,但是会错过很多语言中一些让人惊叹的东西。

InfoQ:Go 通常被描述为一种可编程的语言,您能总结下促进此种编程的方法吗?Go 的主要特征定义是什么?

其核心理念很简单。编写精简的让人容易阅读的代码。当事情变得简单,Bug 也会变少,更多的人可以参与进来,随之而来的就是优化。你看到 Go 的语法是天生简约的,而不是给人惊异。来自外部的语言不是天方夜谭也不会去尝试,来自内部创新的软件的语言则打破常规,为程序员建立了尽可能简单而不是复杂的新局面。毕竟生产力才是程序员的一切。

InfoQ: 高度支持并发是 Go 的重要特性之一,其拥抱 CSP 范式和 goroutines。麻烦您描述下此模式给程序员们带来的好处?和其它相关的并发模式比较起来呢?例如 actors。

频道是由 Go 引进的一项新的并发编程的工具。频道提供了一种编排 goroutines 以执行工作流的方法。也提供对 goroutines 的友好机制以及 Go 运行时的调度方法。我认为 actor 机制也能够在 Go 和频道下很好的工作。
Go 并不能让撰写并发软件变得简单,我认为太多的人们过度的解读了 goroutines 和频道。毕竟它们只是工具,需要去用心学习并能够正确的使用它们的。我知道频道让很多人来关注 Go 语言,但是让人深入或使用 Go 还得看接口和 composition 以及语言的简单性。

InfoQ:Go 最近作了替代大量的 Python 脚本的工作。你认为这将会是一个主要的方向嘛?是 Go 的哪些特性让这种替代成为可能?

我曾经花了两年的时间作语言的教学工作,并有幸接触的是一线的公司。我在我的班里教的编程语言有 Python、Ruby、Java 和 C。我认为越来越多的被采用才是高效程序员所使用的语言。任何人都可以使用 Go 来写代码,但是写出高质量代码需要走好长的路。能够有效的整合才是高效的表现。

InfoQ:Go 摒弃了继承和类型层次的想法,即我们众所周知的 OOP。然而,Go 依然掌控着类型的组成和接口,看起来蛮有效果。您如何描述这一编程范式?在您个人使用 Go 的经验中,有没有感到,从另外的地方派生出的类型会更有帮助?

我认为 Go 的最大的优点是隐藏在接口之后机制和嵌入的部分,再加上编译器的设计让程序员更加简单、高效的使用。Go 是一门面向对象编程的语言,然而这并非是你去花所有时间去关注的部分。Go 允许程序员利用已有的类型来重复使用和扩展它们。Go 允许直观的对接口编程且类型安全。此视频或许可以帮助你了解这点。

来自 composition 的观点,此博客讲述了更多的细节。

我希望能够有时间在书中写一些关于 composition 的实例,在下个版本我会加入。

InfoQ: 一个语言的成功与否,工具占据着很重要的位置。在您的书中,您聚焦于语言和它的标准库,关于 Go 的可用的工具您持何种看法?

Go 提供的工具是惊人的。语言团队提供了你需要的调试和分析程序的一切。而且社区还构建了对语言团队本身已经提供的进行了扩展的工具。这里有一些你可以浏览到的主题: testing Benchmarking memory trace schedule tracing stack trace

InfoQ: 新近出现了一些语言呈竞争状态,它们有:Go、Rust、D、Scala 等。您认为 Go 能从它们中间脱颖而出吗?

竞争是不存在的。每一种语言解决不同的问题,且它们是可以共存的,甚至是在同一技术栈中。我喜欢 Rust,而且它颇具潜力。我认为语言的语法不一是人们需要花时间去切换的主要原因。我会学习 Rust 这门语言的。

官方站点购买此书时使用代码“goiaiq”,可获得38% 的优惠折扣。

您可以下载Go 语言实战的代码示例,从而获得此书的第一印象。

关于作者

William Kennedy是来自佛罗里达州的迈阿密一家叫做 Ardan Studios 公司的管理合伙人,Ardan Studios 是一家做移动、web 应用和系统开发的公司,他是 Go 语言实战的作者之一,博客 GoingGo.net 的作者,是迈阿密的 Go 和 MangoDB 小型线下聚会的组织者,Bill 通过 Ardan Labs,他新投资的科技公司,醉心于 Go 的教育与传播,Bill 也经常在一些研讨会上发表演讲,无论是在本地还是通过 Hangout。他经常会找一些热衷于 Go 的知识、博客、编码技能的个体或团队切磋。@goinggodotnet

查看英文原文: Go in Action - Review and Q&A with Author

2016 年 2 月 15 日 17:283624
用户头像

发布了 30 篇内容, 共 92258 次阅读, 收获喜欢 0 次。

关注

评论

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

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(六)

图雀社区

node.js Vue

为什么你成不了「超级个体」?

非著名程序员

程序员 互联网 提升认知 认知提升

深入理解JVM垃圾回收机制 - 何为垃圾?

NORTH

深入理解JVM 垃圾回收机制

别做误人子弟的「职业导师」

Tony Wu

职业成长 导师 教练

多来点胜利,对冲颓丧

zhoo299

成长 备忘

MyBatis启动之XMLConfigBuilder解析配置文件(二)

ytao

后端 mybatis

过滤器 和 拦截器 6个区别,别再傻傻分不清了

程序员内点事

Java

centos6.9开机启动服务说明

唯爱

机器学习算法评估指标——2D 目标跟踪

做技术BP的文案Gou

学习 2D 评估标准

React之Context源码分析与实践

费马

源码分析 React useContext Context React-Router

白天写代码,晚上摆地摊!9年前摆地摊学会了这些道理...

王磊

ARTS-WEEK02

lee

【大厂面试03期】MySQL是怎么解决幻读问题的?

NotFound9

MySQL 数据库 编程 架构

中台上线半年,我总结出了“七宗罪”

夜来妖

中台 企业中台 后台开发 业务中台 后台

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(三)

图雀社区

vue.js Vue Node

csapp-chapter1

卓丁

深入理解计算机系统 csapp

hexo博客系统的实现原理与搭建

音视频专家-李超

Hexo 博客

源码分析 | 像盗墓一样分析Spring是怎么初始化xml并注册bean的

小傅哥

源码分析 小傅哥 spring源码 bean注入过程

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(四)

图雀社区

Vue Node

如何让解决无法访问 GitHub 的问题?

JackTian

GitHub

分布式架构,刚性事务-2PC必须注意的问题及3PC详细解

奈学教育

分布式架构 2PC注意事项 3PC详解

判例学习(一)梨视频诉字节跳动帮助侵权二审判决

尹晓铁

学习 读书笔记 互联网 知识产权 法律

做一个纸上谈兵的项目经理

escray

重磅推出:第14份年度敏捷状态报告(最新2020)

Bob Jiang

敏捷 调查报告 state of agile

游戏夜读 | 网络游戏怎么赚钱?

game1night

深入理解Java虚拟机

NORTH

深入理解JVM

大厂经验(1):一套Web自动曝光埋点技术方案

DeeperMan

大数据 数据采集

强烈安利第一个画图工具!

我是程序员小贱

高效工作 高效

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(五)

图雀社区

Vue Node

csapp-chapter2

卓丁

深入理解计算机系统 csapp

Android工程架构演进及康威定律

石头

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

《Go语言实战》内容回顾与作者采访-InfoQ