写点什么

采访: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:558189
用户头像

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

关注

评论

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

长安链源码分析启动(6)

长安链

【Django | allauth】登录_注册_邮箱验证_密码邮箱重置

计算机魔术师

8月月更

MQ 的原理以及持久化

浅羽技术

MQ 消息队列 Activemq active 8月月更

电商出海,独立站小程序化能更好的连接人和应用

Speedoooo

小程序 移动开发 DTC 独立站 移动框架

锁住它,快告诉我乐观锁与悲观锁的区别?

知识浅谈

8月月更

列存数据仓库怎样做才能更高效

jiangxl

前后端数据接口协作提效实践

百度Geek说

Java 数据 企业号九月金秋榜

【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!

冰河

并发编程 多线程 高并发 协程 异步编程

[JS入门到进阶] 手写裁剪图片的工具,并部署。一键裁剪掘金文章封面

HullQin

CSS JavaScript html 前端 8月月更

STM32+M5311对接 OneNET 项目记录

矜辰所致

stm32 8月月更 M5311

悲观锁和乐观锁的区别以及实现方式

浅羽技术

乐观锁 悲观锁 8月月更

开源一夏 | count(列名)、 count(常量)、 count(*)区别

六月的雨在InfoQ

开源 count MySQL 数据库 MySQL InnoDB 8月月更

科普达人丨一图看懂安全组

阿里云弹性计算

防火墙 安全组 ECS

vivo前端智能化实践:机器学习在自动网页布局中的应用

vivo互联网技术

机器学习 前端 网页布局

锁分类

TimeFriends

8月月更

【小程序项目开发-- 京东商城】uni-app之自定义搜索组件(中)-- 搜索建议

计算机魔术师

8月月更

阿里云高庆瑞:如何快速搭建低成本高弹性的云上应用

阿里云弹性计算

应用 自动化运维 CloudOps 弹性伸缩

从项目经理过渡到ScrumMaster的三个技巧

ShineScrum

Scrum 敏捷 ScrumMaster 项目经理

HMS Core基于地理位置请求广告,流量变现快人一步

HarmonyOS SDK

广告sdk

实战 | 电商业务的性能测试(一): 必备基础知识

霍格沃兹测试开发学社

前端高频面试题(二)(附答案)

helloworld1024fd

JavaScript 前端

数字藏品app开发:nft数字藏品是什么?怎么制作和出售?

开源直播系统源码

数字藏品 数字藏品软件开发 数字藏品源码出售 数字藏品开发 数字藏品系统

【小程序项目开发--京东商城】uni-app之自定义搜索组件(上)-- 组件UI

计算机魔术师

8月月更

日拱算法:什么是“煎饼排序”?

掘金安东尼

算法 8月月更

京东云PostgreSQL在GIS场景的应用分享

京东科技开发者

postgresql 检索 jieba 京东云 信息检索

Mysql安装教程

楠羽

#开源

数据仓库与数据中台最大的区别是什么?终于有人讲明白了

雨果

数据中台 数据仓库

流支付时代的Zebec,将打开Web3支付的大门?

西柚子

Flomesh 发布 Pipy 0.50.0

Flomesh

BaaS助力区块链技术开启下一轮应用热潮

旺链科技

区块链 产业区块链 企业号九月金秋榜 BaaS平台

2. 字符串、向量和数组

鱼书

c++ 操作系统 8月月更

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