采访:Go语言编程
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 ...
随机推荐
- 9月1日,请记得备好名片来PechaKucha Night和大家“闲聊” | Hi!设计
9月1日,请记得备好名片来PechaKucha Night和大家"闲聊" | Hi!设计 9月1日,请记得来PechaKucha Night和大家"闲聊"
- org.apache.struts.chain.commands.InvalidPathException: No action config found for the specified url.
No action config found for the specified url url路径下找不到action,原因是stuts-config.xml文件配置错误. demo的项目文件如下: ...
- appcan里面模板的使用
1:首先要定义一个字符串如果太长需要换行,可以用"\"来分割每行 2:模板里面使用的是ejs语法,所以可以使用if else语句等 3:字符串定义好之后要用appcan.view. ...
- Linux内核-内核线程
线程分类:内核线程.用户线程(指不需要内核支持而完全建立在用户空间的线程库,这种线程效率高,由于Linux内核没有轻量级进程(线程)的概念,因此不能独立的对用户线程进行调度,而是由一个线程运行库来组织 ...
- Com编程入门——什么是COM,如何使用COM
本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念.内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件.本文不包括如何编写自己的COM对象和接口. CO ...
- [ES6] Object.assign (with defaults value object)
function spinner(target, options = {}){ let defaults = { message: "Please wait", spinningS ...
- rk3288 ov8858 camera移植
平台:瑞芯的rk3288 SDK:4.4/5.0/5.1 作者:fulinux *****本文同意转载.只是请注明出处:http://blog.csdn.net/fulinus**** rk3288的 ...
- node中的Readable - flowing/non-flowing mode
大家都知道在node中Readable Stream有两种模式: flowing mode和non-flowing mode. 对于flowing mode的Readable Stream, 我们是没 ...
- Mui实现退出登录
document.getElementById("logout").addEventListener("tap",function(){ var btn=[&q ...
- SpringMVC04controller中定义多个方法
public class MyController extends MultiActionController { // 新增 方法修饰符要是public public ModelAndView ad ...