Go语言是Google公司在2009年开源的一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,被很多Go语言传道者誉为“互联网时代的C语言”。而C++语言诞生于1979年,可以将C++语言视为一个语言联邦,主要包含C语言(面向过程)、面向对象、STL容器和算法、范型编程(模板)4部分,它高效强大同时又臃肿复杂,目前最流行的是C++11标准,它的很多优化为C++注入了新的活力。

谷歌出品,必属精品。Go语言流行至今,大有颠覆C++和Java在大型系统开发中的霸主地位的趋势,这篇文章简要分析Go语言相对于C++的优点,内容主要来自个人感悟,如有不对的地方还请朋友们批评指正。

1、语法规范。Go语言实现了语法规范的高度统一,例如Go语言规定大写字母开头是公开类型,而小写字母开头是私有类型,真正做到了语言规范的最高境界之“望文知义”。而在C++开发代码里没有这样的规定,因此看到一个类的成员变量名称,还需要跳转到类的定义才能确定它的访问级别。Go语言强制规定了语法规范(不符合规范的代码无法编译通过),在工程中非常实用。

2、接口设计。Go语言的核心是组合而不是继承,Go语言支持面向对象,但是不支持继承。因此在用Go语言设计程序时不需要考虑基类的设计,它的接口设计更为灵活,只需要专注每个类应该实现的功能。而C++语言支持继承,很多面试官都喜欢问为什么基类的析构函数一定要是virtual的?public继承和private继承的区别是什么?在Go语言里,这些都统统不复存在。

3、开发工具。Go语言作为Google的亲儿子,它提供了编译、测试、调试、性能分析等一系列标准工具,它的编译效率极高,原生支持单元测试,支持调试和代码检查、性能分析等等,是一个名副其实的工程化开发语言;在C++中需要借助各种各样的开源工具来组合达到这个目标,其中用于C++程序性能分析的工具gperftools就是Google开源的。

4、支持并发。Go语言被设计为支持并发,可以通过go关键字创建N个goroutine(一种用户态线程)来实现并发,同时提供多个goroutine的同步机制,例如当N个goroutine都执行完毕才继续执行。而C++需要借助第三方框架来实现并发功能,例如线程池+异步调用(一般由第三方RPC框架提供)。Go语言提供语言层面的并发支持,可以轻松的开发出并发框架。

5、内存管理。Go语言和Java、python、lua一样,都不需要程序员管理内存。而有经验的C++程序员看到别人代码里的new就害怕,因为不知道有没有相应的delete,还有就是在哪里delete的,会不会执行不到等等,总之是为内存管理这样无趣又痛苦的事情耗费精力,虽然有auto_ptr、shared_ptr这样的资源管理神器,但是语言本身是没有禁止原生的new/delete的,担心内存泄漏是一件很不爽的事情。

6、defer语句。Go语言提供defer语句来保证释放资源,例如在某个函数中打开一个文件后,通过defer filer.Close()来保证关闭文件操作一定会在函数结束时执行,而在C++中想做到这一点需要一些技巧,例如运用goto跳转,或者封装一个文件资源管理器。这点可以看出Go语言设计的多么贴心。

7、语法简洁。Go的关键字更少,同时砍掉了很多不必要的功能,例如构造函数、析构函数(Go语言为每个对象赋予初始值,负责自动内存回收)。Go语言不需要每一行代码都以分号结尾,python和lua也是这样。

8、函数支持多返回值。Go语言的函数支持返回多个值,例如返回计算结果数据和错误值,python和lua也都都支持这一特点,而在C++只支持单返回值,需要增加函数参数来达到同样的目的,所以有时候C++函数有很多参数的原因,是因为有的参数被设计为出参。

9、内置标准库。Go语言提供了http、json、xml、正则表达式等很多后端系统开发中常用的库,而C++需要使用很多第三方的库,其缺点是在技术选型上花费一些时间和精力,或者花费更多精力自己造轮子。

10、运行效率。Go语言作为一个编译型语言,它的运行效率是很高的,远远高出解释型的语言,不过当然没有高质量的C++代码程序运行效率高。问题是写出高质量C++代码需要付出相当大的努力,这对于很多有经验的C++程序员来说都是一件十分困难的事。

总结:Go语言是一门工程化、现代化的开发语言,吸取了C、C++、Java、python、lua等众多语言的优点和长处,它为程序开发者考虑了很多,同时做了很多贴心的设计,目前非常成功和流行;C++语言语言的优势仍然在于它的运行效率,但是在开发体验和开发效率上已经落后其他语言,C++11、C++14、C++17等标准的推进也是为了让C++语言能够变的更好,适应新的开发潮流,但是它毕竟背负着沉重的历史包袱,想要脱胎换骨是一件很伟大也很困难的事情。


金句分享

思考时,要像一位智者;但讲话时,要像一位普通人。

出自《人性的弱点》,作者是戴尔·卡耐基(Dale Carnegie),美国著名人际关系学大师。

解读:思想要自由,讲话要谦虚。

Go语言相对于C++的优点的更多相关文章

  1. 《与C语言相恋》

    第一章 <与C语言相恋> 目录: 1.1 C语言的诞生 1.2 相恋C语言的理由 1.3 相恋C语言的7个步骤 1.4 目标代码文件,可执行文件和库 1.5 本章小结 C语言的诞生 197 ...

  2. Flink相对于Spark的优点

    Flink相对于Spark的优点 容错 Flink 基于两阶段提交实现了精确的一次处理语义. Spark Streaming 只能做到不丢数据,但是有重复. 反压 Flink 在数据传输过程中使用了分 ...

  3. cpp与其他语言相比较

    new  相当于 malloc ,delete 相当于  free ,用法一样 c++ 有 namespace,可以避免类名污染  namespace xx{} c++ 有类 这个与 c#.as3比较 ...

  4. 自己使用 1.C语言历史以及特点。

    1. C语言的发展及特点? C在1969--1973年间与Unix操作系统同时诞生:最富创造性的时期是1972年.另一次大的变化发生在1977到1979年间,当Unix系统的可移植性得到证明时.在后一 ...

  5. 论C++的发家史以及相对其他语言优缺

    C++发家史: 最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样 ...

  6. 【转】对 Go 语言的综合评价

    以前写过一些对 Go 语言的负面评价.现在看来,虽然那些评价大部分属实,然而却由于言辞激烈,没有点明具体问题,难以让某些人信服.在经过几个月实际使用 Go 来构造网站之后,我觉得现在是时候对它作一些更 ...

  7. 一步步分析:C语言如何面向对象编程

    这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...

  8. Markdown与标记语言

    Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...

  9. C/C++语言,自学资源,滚动更新中……

    首先要说<一本通>是一个很好的学习C/C++语言的自学教材. 以下教学视频中,缺少对"字符串"技术的讨论,大家注意看书.         一维数组,及其举例:(第四版) ...

随机推荐

  1. Android微信支付SDK开发

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

  2. webpack必知必会

    细节 url-loader和file-loader是什么关系? file-loader用于将文件路径打包为另一个url,url-loader封装了file-loader.使用url-loader时,只 ...

  3. Oracle EBS AR 更新客户账户层

    declare x_return_status ); x_msg_count NUMBER; x_msg_data ); x_profile_id NUMBER; l_location_id NUMB ...

  4. Asp.net单点登录解决方案

    原文出处:http://www.cnblogs.com/wu-jian 主站:Passport集中验证服务器,DEMO中为:http://www.passport.com/ 分站:http://www ...

  5. 纲举目张:打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  6. Skype for Business Server 2015 企业语音部署和配置

    Skype for Business Server 2015包含的企业语音功能可实现更丰富的通信和协作.例如,可以将企业语音部署配置为启用Skype for Business Server 2015客 ...

  7. el表达式便利map集合

    <c:forEach items="${b.goodMap}" var="entry" varStatus="status"> ...

  8. javascript Spline代码

    代码是通过网上一个winform代码中提取修改而来的.后转为javascript 版本. /* points = new Array(); points.push({x:1,y:2}); */ fun ...

  9. Spring 源码阅读之BeanFactory

    1. BeanFactory 的结构体系如下: 2. XmlBeanFactory ,装载Spring配置信息 package org.springframework.beans.factory.xm ...

  10. sql server 使用链接服务器连接Oracle,openquery查询数据

      对接问题描述:不知道正式库oracle数据库账户密码,对方愿意在对方的客户端上输入账号和密码,但不告诉我们 解决方案:使用一台sql server作为中间服务器,可以通过转存数据到sql serv ...