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. java 内存分析之方法返回值二

    package Demo; class Point { private double x, y; public Point(double x, double y) { this.x = x; this ...

  2. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  3. 记录下使用iis7代理node.js写的网站程序

    昨天晚上一个学弟的紧急求救,说了自己接的单子做了一个网站,使用了自己熟悉的技术——node.js+mongdb,但当看到部署环境惊呆了,是 windows+sqlserver.这些都不是关键,关键是服 ...

  4. python中的字符串编码问题——2.理解ASCII码、ANSI码、Unicode编码、UTF-8编码

    ASCII码:全名是American Standard Code for Information Interchange,ASCII码中,一个英文字母(不分大小写)占一个字节的空间,范围0x00~0x ...

  5. OtterTune来了,DBA怎么办

    https://blog.csdn.net/xiangzhihong8/article/details/72887476 最近AI的新闻特别多,席卷了围棋圈之后,成为了技术圈和媒体热捧的话题. 今天又 ...

  6. 由于使用JDBC ResultSet的滚动功能而导致的内存溢出

    前天一去公司,老大说,服务器全挂了! 最后排查了半天,结论是内存溢出! 在WAS的DUMP日志中,看得我头晕眼花,终于找到了罪魁祸首,原来是有同事写代码的时候使用了可滚动的结果集导致内存溢出. 什么是 ...

  7. Hybris阶段总结(2)hybris架构

    年前总结一下这两个星期在SAP实习学到的一些东西 先上图: ​ 从底往上总结,之后会有个小例子来解释一下 1.Persistence layer 就是作为hybris所连接的数据库这一层,其中hybr ...

  8. C盘下出现msdia80.dll文件

    删除方法 https://jingyan.baidu.com/article/63acb44acef55661fdc17e56.html 或者 https://www.cnblogs.com/ggll ...

  9. zabbix日常监控项TCP连接状态(六)

    TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是time_wait值比较高的话,我们要考虑看 ...

  10. 字符串到-->list到-->字典的转变

    怎么把字符串变成字典呢?? 要先转成列表list(用split方法),然后再把列表转成字典,这时候就用到-->怎么把列表转换成字典呢??列表的索引和字典的新增,然后就能把字符串转成字典了.