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)产品会很有用,而不是大规模的销售团队。然而,我并不准备付出时间,因为我主要的市场还是美国,对于我来说冒着花费时间和精力的风险,而只是让专利流氓能够“偷到”更多东西,是非常不经济的。
关于书的作者
采访:Go语言编程的更多相关文章
-
C语言编程实现Linux命令——who
C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...
-
个人c语言编程风格总结
总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...
-
Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
-
混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++
前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...
-
Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
-
LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
-
第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
-
华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
-
9 本免费的 Python 语言编程书籍(转载)
9 本免费的 Python 语言编程书籍 原文地址:http://linuxtoy.org/archives/9-free-python-books.html 2010-03-03 Toy Poste ...
随机推荐
-
Android APP 两种用程序拨号的方式
想在APP中添加一个拨号功能该怎样做呢?Android提供了两种方式,一种是ACTION_CALL方式直接拨打,另一种是ACTION_DIAL方式打开系统的拨号界面. 下面我们来做个小例子 首先需要在 ...
-
graph-tool文档(一)- 快速开始使用Graph-tool - 3.图的过滤
目录: 图的过滤 图视图 -- 组合图视图 名词解释: filter:过滤 mask:屏蔽 inverted parameter:倒参数 overhead:开销 minimum spanning tr ...
-
iOS开发--轮播图
在不少项目中,都会有图片轮播这个功能,现在网上关于图片轮播的框架层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里说说笔者的主要思路以及大概步骤,具体代码请看这里, ...
-
struts2 的action 向页面传值
写一个Action类: public class LoginAction{ public String execute(){ return SUCCESS; } public void setValu ...
-
Java中equal和==区别及String创建过程
Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...
-
JavaWeb学习日记----XML的解析
XML的解析简介: 在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象. 比如:docu ...
-
poj2018 二分+线性dp好题
/* 遇到求最值,且答案显然具有单调性,即可用二分答案进行判定 那么本题要求最大的平均数,就可以转换成是否存在一个平均数为mid的段 */ #include<iostream> #incl ...
-
利用ML&;AI判定未知恶意程序——里面提到ssl恶意加密流检测使用N个payload CNN + 字节分布包长等特征综合判定
利用ML&AI判定未知恶意程序 导语:0x01.前言 在上一篇ML&AI如何在云态势感知产品中落地中介绍了,为什么我们要预测未知恶意程序,传统的安全产品已经无法满足现有的安全态势.那么 ...
-
url和资源的再理解
元数据管理系统中, 确实是所有的静态资源都放在WebContent 不在dgs这个主项目中,通过url访问了 下面的这个项目在dgs中
-
UI自动化测试(五)TestNG简介与安装步骤
简述 TestNG是一个设计用来简化广泛的测试需求的测试框架, 从单元测试(隔离测试一个类) 到集成测试(测试由有多个类多个包甚至多个外部框架组成的整个系统, 例如运用服务器) . testNG灵感来 ...