Jason攻城狮 Golang相对于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语句来保证释放资源 , 例如在某个函数中打开一个文件后 , 通过deferfiler.Close()来保证关闭文件操作一定会在函数结束时执行 , 而在C++中想做到这一点需要一些技巧 , 例如运用goto跳转 , 或者封装一个文件资源管理器 。 这点可以看出Go语言设计的多么贴心 。
7、语法简洁 。 Go的关键字更少 , 同时砍掉了很多不必要的功能 , 例如构造函数、析构函数(Go语言为每个对象赋予初始值 , 负责自动内存回收) 。 Go语言不需要每一行代码都以分号结尾 , python和lua也是这样 。
8、函数支持多返回值 。 Go语言的函数支持返回多个值 , 例如返回计算结果数据和错误值 , python和lua也都都支持这一特点 , 而在C++只支持单返回值 , 需要增加函数参数来达到同样的目的 , 所以有时候C++函数有很多参数的原因 , 是因为有的参数被设计为出参 。