写点什么

采访:Go 语言编程

  • 2012-12-21
  • 本文字数:2870 字

    阅读完需:约 9 分钟

Go 语言是由 Google 在 2009 年 11 月份公布的,它的目标是要应对软件开发所面临的最新挑战。Go 语言特别被设计为快速(包括在编译时)、支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性。Mark Summerfield 最近出版了《Go 语言编程》一书,目的是要帮助当前的程序员学习 Go 语言。InfoQ 最近有幸和 Mark 一起讨论了 Go 语言和他的著作。

InfoQ:你喜欢 Go 语言的哪些特点?

Mark Summerfield: Go 语言有很多特点我都非常喜欢,其中最主要的是:

  • 像闪电一样快的编译。这使得编辑 / 编译 / 运行的周期和 Python 的编辑 / 运行周期一样快。
  • 非常高级的并发。你可以很轻松地使用 Go 语言编写并发程序,而不会有任何显式的锁。另外,goroutine 通过操作系统线程多路传输的方式,这意味着,如果你的算法最好以成千上万个并发线程来表示,那么你就可以创建那么多 goroutine——而对于线程,通常最好不要创建过多。
  • 无初始化和垃圾回收。这让我们避免了整整两类错误的发生,让编码更简单。
  • 语言本身非常小,让一般的程序员就可以掌握。当考虑模板语言的时候,C++98/03 已经不是一般程序员所能接受的, 而 C++11 更大,也更复杂。与它们相比,Go 语言:
  • 使用了新奇的方式来实现面向对象。我发现这种方法很有趣。
  • 对 Unicode 的支持。我非常喜欢 Go 语言让你可以使用原生 UTF-8 或者使用根据你想要的来使用 Unicode 字符的方式。

InfoQ:你不喜欢 Go 语言的哪些特点?

Mark: 最初我不喜欢它的错误处理方法(返回错误值作为唯一或者最后一个返回值),因为我不习惯使用这样的异常处理方式。然而,现在我非常乐于使用它了。

我还忘了说操作符重载。IMO 这个大程序包(针对 big.Int 和 big.Rat 类型)很难使用,因为你无法对操作符重载。另外,尽管 Go 缺少泛型,但那只是针对于类库编写者的问题。由于 Go 拥有其它语言特性,所以不太需要泛型,比方说它对“<”的操作符重载对于定义自定义的数据类型就非常好。

InfoQ:从你作为作者的经历看,我发现你已经撰写了好几本关于 Python 的书。这两种语言相比,你的感觉如何? Go 的那些方面让你想念 Python? 相对而言,Go 的哪些方面让你可以忘记 Python?

Mark: 我要说,总体上看来,Python 3 是我最喜爱的语言。然而,Go 是我最喜欢的编译型语言。
我知道很多 Python 程序员都已经试过 Go,但是从个人来说,如果他们想要的是更好的性能,那么最好使用 numpy,如果想要快速的算法,可以使用 Cython。
Go 想要成为 21 世纪的 C 语言,当然我认为时间会验证,Go 会成为一种非常有影响力的语言。我确信它会导致其他语言至少增加 CSP 类库来支持 Go 样式的并发。

在语言和标准库方面,Go 已经比 C 更令人惊奇了。然而,C 拥有很多很多第三方类库(尽管使用 cgo 包我们也可以在 Go 中使用它们)。

我认为 Go 拥有足够的高级特性,可以吸引那些想要更高性能、更好的并发模型以及更自由许可的 Java 程序员。
我还认为 Go 可以替换 C++ 11,为 C++ 程序员提供很多内容。Go 的标准类库比 C++ 更小——但是实际上包含了更多实用的现实功能。当然,C++ 程序员会发现 Go 语言没有它们所习惯的一些东西——但是在几秒钟或者几分钟内完成编译,而不是花费几十分钟甚至几个小时会让我们更有生产力,并且 Go 要比 C++ 更易于维护,因为它是一种更小、更易于理解的语言。当然,Go 并不是 C++,在三点上还是有区别的(C 预处理程序,它没有 scope 的概念;C++ 运行时语言;C++ 编译时语言,即模板)。

此外,Go 程序会编译成单一的可执行文件,而没有任何外部依赖。这使得部署——比方说,在一个组织中所有计算机上——更容易,不需要担心所有计算机是否都拥有相同的类库。

Go 语言即让大家感到熟悉(在 C 家族中),并且还在关键问题上(面向对象、并发、错误处理、轻量级语法)采取了非常先进的标准,这使得 Go 非常值得学习,至少我认为是主流编程中可选的一种方法。

InfoQ:非常感谢你对 Go 做出的与其他语言的比较,特别是描述了与 C++11 相比,它是如何降低了复杂度。你是否发现 C++11 也做出了足够重大的变化,会导致现有的程序员在拥有足够自由度的时候考虑转换到 Go 语言?

Mark: 尽管我认为从 C++98/03 到 C++11 的发展历程表示有机会可以重新评估并转换到 Go 语言,但是我认为大多数人实际上不会那么做。C++ 需要在学习上投入很多。我猜想很多程序员会继续使用 C++11 的子集,而不是更换语言,特别是对于比 C++11 小的语言(那样看起来特性也比较少)。当然也会有些人转换到 Go 语言,特别是那些拥有能够从 Go 的高级并发模型中受益的应用程序的人。

使用 C++98/03 我们已经有一种形势,很多程序员使用语言的特定子集,让他们感到很舒服。当两位或更多使用不同子集的 C++ 程序员必须一起工作,或者维护不是他们编写的 C++ 代码的时候,就会导致问题。我认为 C++11 会显著地放大这个问题。

Java 的设计要比 C++ 更简单,并在很多方面都很成功。Go 是要设计成更好的 C,所以我期望它会赢得更多 C 程序员(对他们来说全都是收获)而不是 C++ 程序员(对他们来说既有收获,也会失去一些特性,像泛型)。

InfoQ: 你对 Go 语言的简洁性大加赞赏,但是否有一些你认为应该增加的特性呢? (可能会期望增加操作符重载和泛型。)

Mark: 我认为你可能需要操作符重载,而不需要泛型。但是我认为唯一真正缺少的是排序的映射表(ordered map)(尽管我在书中提供了对左倾红黑树的 Go 实现作为例子,它也填补了特定的空白)。

InfoQ: 你在书的目录中还特别说明了专利流氓的危险。是什么让你包含这项内容呢? 你是否认为有必要提醒大家意识到这个问题,或者是特定的什么事情?

Mark: 我一点儿也不喜欢专利:我认为那是反竞争的,并且大公司会比小公司更喜欢它。对于软件,版权就已经足够了。我之所以包含了附录,是因为现在我已经开始听说有些程序员开始从美国的市场(例如编写 iOS 程序的人们)撤回软件,因为不那么做的话,就需要给专利流氓支付“保护费”。软件专利使得个人程序员或者小团队更难竞争,我认为这不仅仅是可耻,而且在道德上是错误的。

在过去的几年间,我对商业化软件有一些看法:利基(niche)产品会很有用,而不是大规模的销售团队。然而,我并不准备付出时间,因为我主要的市场还是美国,对于我来说冒着花费时间和精力的风险,而只是让专利流氓能够“偷到”更多东西,是非常不经济的。

关于书的作者

Mark Summerfield 以一等毕业生从威尔史旺西大学的计算机科学专业毕业。在工作之前,他继续做了一年的研究生。他从事软件工程师职业多年,在加入 Trolltech 之前在多家公司中工作过。他还作为 Trolltech 的文档管理员工作了将近三年,在那期间他编辑了 Trolltech 的技术杂志《Qt 季刊》。Mark 是《

C++ GUI Programming with Qt 3 》和《

C++ GUI Programming with Qt 4》的共同作者,并且是《

Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming》的作者。Mark 是

Qtrac Ltd. 公司的老板,在其中他作为独立作者、编辑、培训师和顾问工作,专注于 C++、Qt、Pytho 和 PyQt。

查看英文原文: Programming in Go - An Interview

2012-12-21 02:558142
用户头像

发布了 340 篇内容, 共 131.6 次阅读, 收获喜欢 13 次。

关注

评论

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

immutability模式

wzh

Java 设计模式 并发 线程安全

安全团队和云计算团队之间更好协作的6个技巧

云计算

如有神助!阿里P7大牛把Spring Boot讲解得如此透彻,送你上岸

飞飞JAva

一击必杀!内网渗透——对不出网目标的精准打击

Thrash

安全

2021,国产数据库人的最好时代

BinTools图尔兹

数据安全 数据库管理 国产数据库

区块链为何会上升国家战略技术?

CECBC

区块链

架构实战营 - 模块 3- 作业

carl

IDEA 的 debug 怎么实现?出于这个好奇心,我越挖越深!

Java小咖秀

Java debug IDEA 調試

吴凡 ベ莫离: 网友都说MyBatis多表查询太难了,小白:就这?我都学会了

牛哄哄的java大师

硬核资源!清华博士的Spring Boot中AOP与SpEL笔记,码农:膜拜

牛哄哄的java大师

Java

数据架构:概念与冷热分离

程序员架构进阶

数据架构 架构设计 28天写作 5月日更 冷热分离

微前端中,为子应用配备开发环境临时导航菜单,提高开发效率

blueju

JavaScript 大前端 React umi

宝马、沃尔沃、奇瑞纷纷布局,区块链将颠覆汽车行业?

CECBC

LeetCode题解:150. 逆波兰表达式求值,栈,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Map在Java 8中增加非常实用哪些函数接口?

xcbeyond

Java java8 5月日更 内容合集

谈谈测试环境管理与实践

大卡尔

测试环境 工程效能

数字化助力金融科技,实现产业良性循环

CECBC

科技

区块链为法院工作插上科技翅膀

CECBC

法院

全球数字货币加快研发

CECBC

Golang中runtime包的基本使用方式

liuzhen007

Go 语言 5月日更

Nginx基础配置-基础模块配置

梁龙先森

nginx 大前端

IDEA 这样设置,好看到爆炸!!!

楼下小黑哥

Java 程序员 IDEA 编程开发

Redis - 哈希表

旺仔大菜包

redis

架构实战营 - 模块 3- 作业

请弄脏我的身体

架构实战营

玩转直播系列之从 0 到 1 构建简单直播系统(1)

vivo互联网技术

消息推送 RTMP 直播推流

网易数帆云原生故障诊断系统实践与思考

网易数帆

Docker 云计算 Kubernetes 云原生 故障诊断

编程规范的意义

顿晓

5月日更 编程规范

网络攻防学习笔记 Day6

穿过生命散发芬芳

5月日更 网络攻防

要不要去创业?

石云升

创业 5月日更

Dubbo 服务分组与多版本

青年IT男

第八大洲环游记(三):人间胜境新西兰,AI孤岛or方舟?

脑极体

采访:Go语言编程_语言 & 开发_Jeff Martin_InfoQ精选文章