Go语言相对于C++的优点
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++的优点的更多相关文章
- 《与C语言相恋》
第一章 <与C语言相恋> 目录: 1.1 C语言的诞生 1.2 相恋C语言的理由 1.3 相恋C语言的7个步骤 1.4 目标代码文件,可执行文件和库 1.5 本章小结 C语言的诞生 197 ...
- Flink相对于Spark的优点
Flink相对于Spark的优点 容错 Flink 基于两阶段提交实现了精确的一次处理语义. Spark Streaming 只能做到不丢数据,但是有重复. 反压 Flink 在数据传输过程中使用了分 ...
- cpp与其他语言相比较
new 相当于 malloc ,delete 相当于 free ,用法一样 c++ 有 namespace,可以避免类名污染 namespace xx{} c++ 有类 这个与 c#.as3比较 ...
- 自己使用 1.C语言历史以及特点。
1. C语言的发展及特点? C在1969--1973年间与Unix操作系统同时诞生:最富创造性的时期是1972年.另一次大的变化发生在1977到1979年间,当Unix系统的可移植性得到证明时.在后一 ...
- 论C++的发家史以及相对其他语言优缺
C++发家史: 最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样 ...
- 【转】对 Go 语言的综合评价
以前写过一些对 Go 语言的负面评价.现在看来,虽然那些评价大部分属实,然而却由于言辞激烈,没有点明具体问题,难以让某些人信服.在经过几个月实际使用 Go 来构造网站之后,我觉得现在是时候对它作一些更 ...
- 一步步分析:C语言如何面向对象编程
这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...
- Markdown与标记语言
Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...
- C/C++语言,自学资源,滚动更新中……
首先要说<一本通>是一个很好的学习C/C++语言的自学教材. 以下教学视频中,缺少对"字符串"技术的讨论,大家注意看书. 一维数组,及其举例:(第四版) ...
随机推荐
- 2Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
public class TestException { public static void main(String[] args) { String str = "1"; fo ...
- lua5.3+luasocket
今天安装了luasocket,遇到了很多错误,百度并没有什么针对lua5.3的版本安装luasocket的文章,在这里记录一下. 1.下载lua5.3 下载到了lua-5.3.5.tar.gz版本的l ...
- Chrome 插件推荐
我在这里就是抛砖引玉,各位开发者,有更好的插件请不要吝啬,分享出来. 希望世界和平! 翻译类 沙拉查词 目前使用,感觉挺好的,各种词典,还有统计.划词划句都可以翻译出来. JSON 格式转换 JSON ...
- Mysql中的delimiter详解
初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程.触发器.函数等. 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其 ...
- 全局css,js缓存及更新版本策略
在当今web世界里,CDN对于加速页面加载速度,提高用户体验起了非常重要的作用.但是问题也带来了:作为开发人员,可能需要不定时的更新部分静态文件,比如对网页的重新设计会涉及到css文件的更新,这时怎么 ...
- Oracle诊断工具 - ORA-4030 Troubleshooting Tool
ORA-4030 说明Oracle服务器进程(server process)无法在操作系统(OS)上分配到足够的内存. 导致ORA-4030 的主要原因有: -物理内存不足 -OS kernel/ ...
- 剑指offer 10矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法 java版本: public class Solution { publ ...
- 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)
一.初识MySQL数据库 ###<1>数据库概述 1. 数据库 长期存储在计算机内的,由组织的可共享的数据集合 存储数据的仓库 文件 ...
- 汉诺塔问题php解决
面向过程解决 <?php function hanio($n,$x,$y,$z){//把n个盘子,按照要求从x移到z,y是中介 //递归跳出条件 if($n==1){ move($n, $x, ...
- BZOJ 1821 Group 部落划分 并查集
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1821 题目大意: 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所 ...