相比 C 、C++,Go 为什么不火?

本文深入探讨了Go语言的设计哲学、特色及与C/C++的对比,分析了其在工程化水平、流行度及应用场景上的表现,同时反思了Go是否达到其初衷。

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 我不想种地

封图 | 优快云付费下载自东方IC


640?wx_fmt=png

引言


团队有项目考虑用Go重写,所以花了些时间调研Go。

第一次接触Go是5年前,14年4月份,也是在我司,全职钻研一周,彼时C++中毒太深,内心排斥其他编程语言,看其他语法总觉得有点怪,而且有“C/C++能做任何事,故无用其他语言之必要”的思想在作祟。

我读研阶段用过几年Java,工作以来一直使用C++/C,况且教出几个非计算机系(包括英语系)的职业程序员,所以,我可以不要脸的声称熟练掌握C++吗?

人都有思维定势,皆受限于自己的经验和认知,我亦不能例外,但好在我意识到这一点,所以在调研过程中,努力摒弃成见,尽量摆脱惯性,查阅关于Go的各种(包括核心设计师)文章,倾听拥趸和批评者的不同声音,结合自己的思考和分析,力求客观公正去评价Go。


640?wx_fmt=png

Go语言简介


Go是Google开发的一种静态、强类型、编译型、并发型,并具有垃圾回收功能的类C编程语言。2009以开源项目的形式发布,2012年发布1.0稳定版本,距今已经十年了。

发明一种新的编程语言,首先得找到必要性,不然肯定会被质疑重复造轮子,方法嘛?无非是先找某种语言的一些茬,吐槽一番,复杂、笨拙、低效,不能忍,我要立刻马上分分钟发明一种新的编程语言,完美解决所有问题,不然对不起我卓尔不群的智商。

Go的故事也很套路,G公司的Pike大牛听完C++0x的演讲,回到办公室,开始编译C++,等待编译过程中,转过椅子面向Robert,讨论语言的问题,然后拉上Ken爷爷一起合计,群嘲之后,受不了C++某些不好用的设计,还没等编译完成,三个人便一拍即合,决定一起搞点change the world的伟大事情,于是乎,Go诞生了。

Go语言之父Pike提到:Go语言是以C为原型,以C++为目标而设计的。因为他觉得C++忒复杂了,要解救程序员于水火。

虽然Go以C++为目标而设计,但尴尬的是,Pike坦承Go并没有吸引来多少C++程序员,反而是吸引了不少Python、Ruby程序员。


640?wx_fmt=png

Go核心团队


G公司不差钱不缺人,Go团队更是群星荟萃、大咖云集,不废话,直接上图:

640?wx_fmt=png

核心设计师Pike和Ken都是出身自贝尔实验室,Ken之于Pike,亦师亦友,共同发明了UTF-8,还共同结对编程过,感情好的像穿一条裤子。

Pike是Unix先驱,贝尔实验室最早跟Ken、Dennis一起开发Unix的猛人,Plan9 OS的灵魂人物。大胡子Ken爷爷则是Unix之父,和Dennis一起发明了C语言,殿堂骨灰级程序员,早已是名满天下。

技术实力毋容置疑,不过这哥俩都是玩Kernel的,经历相同,理念相近,自己也都坦诚C用得最多最熟,所以注定了Go的类C特性,不过这会不会导致Go在语言上对OOP以及现代编程思想的支持不足,亦未可知。


640?wx_fmt=png

Go的哲学


Go信奉的哲学:Less Is More,大道至简。

C++语法自由自在,于是乎一群大佬为tab or space、大括号要不要换行等诸如此类的格式问题吵得不可开交。Go设计师认为,都是吃饱了撑的。

于是Go规定左大括号{不能换行放置,没有为什么,对着干直接编译不过。

Go编译器内建工具gofmt强制源码格式化。对不起,没有选项,我的地盘听我的,把精力focus到真正重要的事情上来,停止无意义的争吵。

这其实也是一种哲学:给你(我认为)最好的,而不是给你选择。

不过Go强加个人喜好的一刀切做法,也招致批评和厌恶。有比较刚的程序员,直接因为大括号不让换行离弃Go。

作为一个经历过各种风骚妖媚代码格式要求的程序员,我露出了心满意足的诡笑。


640?wx_fmt=png

Go的特色


Go是介于C与C++之间的语言,比C抽象层次高,比C++抽象层次低。

因为是一门新的编程语言,站在巨人的肩膀,博采众长,规避了一些已知的问题,开发了一些优秀的特征,相比C/C++,Go的核心特征包括以下几个方面:

  1. 原生并发,以东尼·霍尔的通信顺序进程(CSP)为基础的goroutine,适合现代多核机器

  2. 垃圾回收,非常高效(请来世界顶级内存管理专家设计)

  3. 强大的标准库,对网络编程等的良好支持

  4. CGO提供了GO调用C机制,扩展了GO的能力边界

  5. 内嵌关联数组

  6. 非侵入式的接口设计

  7. 简单清晰的语法


640?wx_fmt=png

Go vs C/C++


640?wx_fmt=png

Go与C语法详细对比详见:http://hyperpolyglot.org/c


640?wx_fmt=png

性能对比


虽然Go号称兼备C++的运行效率和PHP的开发效率,但benchmarks好像并不支持这个结论,数据有点打脸,Go的运行效率接近却略低于Java。

640?wx_fmt=png


640?wx_fmt=png

研发效率


640?wx_fmt=png

我乐观预计Go的研发效率上优于C/C++,特别是Unix环境下。


640?wx_fmt=png

流行度


Go获得TIOBE 2016年度最佳,2017年10月获得第10,历史最高排名。

Go诞生10年,虽然背靠Google,但依然没有挺进编程语言第一阵营近。

一年多排名下滑,铁打Java、C/C++,流水的编程语言。

640?wx_fmt=png


640?wx_fmt=png

工程化水平


640?wx_fmt=png

Docker:大名鼎鼎的开源应用容器引擎;

K8S:容器编排管理系统的事实标准;

Go成为云计算时代流行起来,促进了云计算的发展;

Google用的多,今日头条、Uber等公司也用Go对业务进行了彻底的重构。golang.org YouTube.com也在使用Go开发。

美国市值TOP20有一半在使用Go,国外很多初创公司选择Go,国内关注高,但还未得到广泛应用,应用上呈现国外热国内冷的特点。

Go语言目前所面临的最大问题在于,还没有足够的经验来证明Go是否真的是一个成功的产品,缺少超大型应用实践。

总体而言,Go的工程化水平低于C/C++和Java等第一梯队语言。


640?wx_fmt=png

小结


Go最初声称为了解决Google的问题而设计,为了帮助人们阅读、调试和维护软件而生,但目前为止,还没有达成目标。

摒弃先入为主的观念影响,重新客观审视Go语言,觉得在语言设计层面,Go确实更自然、更简约,抖掉了C++的一些包袱,让程序更容易理解(特别是相对于C),但是随着Go的发展也有可能变重,比如Go 2.0版又把它之前批评的泛型引入了,所以当初Go批评别人的点又有可能反过来被别人批评。

而关于语法层面是否真的更简洁,也是有争议的,比如编程语言专家庄晓立(Liigo)在优快云上有吐槽的文章,仔细读来,也有一定道理,我贴一个链接,可以参考一下。原文:https://blog.youkuaiyun.com/liigo/article/details/23699459

Go在某些点确实有突破,比如让并发编程更容易、运行更高效,比如垃圾回收让程序更安全,比如基于消息(Channel)编程的支持,比如内嵌关联结构,这些都很赞,因为编程语言发展这么多年,任何突破都是艰难和宝贵的。

Go跟C非常像,这并不奇怪,因为设计师都是C语言大师,C/C++程序员很容易切换到Go,但Java程序员可能要困难一些。

Go有它适应场景,比如适合网络程序、云应用,可能在开发速度上确实更快(尤其是相比C),但引入新程序设计语言,势必会引入复杂性。

另一个隐患就是在Java占主导的生态中,Go显得比较小众,跟其他中间件的融合也存在潜在风险。

那么,Go是好的语言吗?Go是理想的编程语言吗?说实话,我不知道,而且我的观点也不重要,这几乎是一个哲学问题。

或许我会尝试用Go开发新项目或者改写老项目,谁知道呢?这取决于权衡折中,也取决于我的心情。


640?wx_fmt=png

附录


一段Go的示例代码,品味一下Go的style吧!

640?wx_fmt=png

作者:我不想种地,欢迎关注作者公众号【码砖杂役】。

声明:本文为作者原创投稿,版权归其个人所有。作者独立观点,不代表程序人生立场。

640?wx_fmt=png

640?wx_fmt=png

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍优快云新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

640?wx_fmt=jpeg

 热 文 推 荐 

程序员为什么爱穿冲锋衣?(最全总结)

程序员甘愿被“996”背后的真相 | 程序员有话说

人间真实:不撕不怒,种种需求,过眼云烟 | 每日趣闻

斯坦福区块链匪帮传奇,那些睡地毯、没日没夜写代码的编程少年

抖音“死于”印度 | 畅言

《捕鱼达人》幕后的开发引擎玩起区块链, 区块链游戏的春天已近?| 人物志

从对ML一窍不通到斩获AT等special offer,拿下大厂算法岗就靠它了

滴滴全链路压测解决之道 | 技术头条

程序员被骗"黑砖窑":监禁、恐吓、996无休编程!

 
 

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"

 
 
 
 

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 优快云 文章。

 
 
你点的每个“在看”,我都认真当成了喜欢
C++ 在音视频处理方向之所以**可替代**,是因为它在性能、底层控制、生态系统和跨平台能力等方面的综合优势远超其他语言。下面我们从多个维度详细解释其原因。 --- ### 回答问题:为什么 C++ 在音视频方向可替代? #### 1. **极致的性能与低延迟** - 音视频处理对实时性要求极高(如直播、通话、编解码),需要微秒级响应。 - C++ 编译为原生机器码,无虚拟机或垃圾回收(GC)停顿。 - 可直接操作内存、使用 SIMD 指令(如 SSE/AVX)、GPU 加速(CUDA/OpenCL),实现高效图像处理、音频滤波等操作。 > ✅ 示例:H.264 解码一帧通常需 <10ms,Java/Python 很难满足此要求。 ```cpp // 使用内联汇编或 intrinsics 进行快速 YUV 转 RGB void yuv_to_rgb_sse(unsigned char* yuv, unsigned char* rgb, int width, int height) { // 利用 CPU 的 SIMD 指令并行处理多个像素 // 性能比纯 C 提升 3~5 倍 } ``` --- #### 2. **零成本抽象(Zero-Cost Abstraction)** - C++ 允许你写出高级接口(类、模板),但编译后几乎带来运行时开销。 - 相比之下,Java 的对象封装、Python 的动态类型都会引入显著额外开销。 ```cpp template<typename Codec> class Encoder { public: void encode(const Frame& frame) { codec_.encode(frame); // 编译期决定调用哪个函数,无虚函数开销(可选) } private: Codec codec_; }; ``` > 上述代码在编译后会被优化成直接函数调用,等效于 C。 --- #### 3. **与硬件和操作系统深度交互** - 音视频涉及大量系统调用: - 摄像头采集(V4L2 on Linux, DirectShow on Windows) - 麦克风/扬声器访问(ALSA, Core Audio, WASAPI) - 显卡加速(OpenGL, Vulkan, DirectX) - C++ 可直接调用这些底层 API,而 Python/Java 必须通过 FFI 或 JNI 包装层,效率更低。 ```cpp // 直接调用 FFmpeg 的 C 接口(由 C++ 调用) extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> } void decode_video(AVCodecContext* ctx, AVPacket* pkt) { AVFrame* frame = av_frame_alloc(); avcodec_send_packet(ctx, pkt); while (avcodec_receive_frame(ctx, frame) == 0) { process_frame(frame->data[0], frame->width, frame->height); } av_frame_free(&frame); } ``` --- #### 4. **成熟的音视频开源生态** 许多核心音视频库是用 C/C++ 编写的,且已成为行业标准: | 库名 | 用途 | 使用者 | |------|------|--------| | **FFmpeg** | 编解码、格式转换、流媒体 | 所有主流播放器、直播平台 | | **GStreamer** | 多媒体流水线框架 | WebRTC、嵌入式设备 | | **OpenCV** | 视频分析、AI 推理前处理 | 自动驾驶、安防监控 | | **WebRTC** | 实时音视频通信 | Zoom、Google Meet、钉钉 | | **x264/x265** | 高效 H.264/H.265 编码器 | 流媒体 CDN | > ⚠️ 这些库大多只提供 C/C++ 接口,其他语言只能通过绑定调用,功能受限、性能打折。 --- #### 5. **资源管理精细可控** - 音视频数据量巨大(如 1080p 视频每秒约 250MB 原始帧)。 - C++ 支持 RAII 和智能指针(`std::shared_ptr`, `std::unique_ptr`),既能自动管理资源,又避免 GC 导致卡顿。 - 可精确控制内存池、缓冲区复用、对象生命周期。 ```cpp class FrameBuffer { public: FrameBuffer(size_t size) : data_(new uint8_t[size]), size_(size) {} ~FrameBuffer() { delete[] data_; } // 确保及时释放 uint8_t* data() { return data_.get(); } private: std::unique_ptr<uint8_t[]> data_; size_t size_; }; ``` --- #### 6. **跨平台部署能力强** - C++ 可编译为几乎所有平台的原生二进制文件: - Windows / Linux / macOS - Android(NDK) - iOS(Objective-C++ 混合开发) - 嵌入式设备(ARM, MIPS) - 音视频应用常需多端一致行为(如 SDK),C++ 是最佳选择。 --- #### 7. **支持高并发与异步处理** - 使用 `std::thread`, `std::async`, `boost::asio` 或 `libuv` 构建高性能网络服务。 - WebRTC 中的 SRTP 加密、RTP 打包、NACK 重传等逻辑都依赖高效并发模型。 ```cpp std::thread video_thread([&]() { while (running_) { auto frame = camera.capture(); encoder.encode(frame); network.send(encode_result); } }); ``` --- ### 对比其他语言的劣势 | 语言 | 在音视频中的问题 | |------|------------------| | **Python** | 太慢,GIL 限制并发,适合脚本/原型,适合生产级编码 | | **Java** | GC 卡顿、JNI 开销大、移动端尚可,但桌面/服务器端少用 | | **Go** | GC 仍存在,cgo 调用 C 库有性能损失,适合高频小对象处理 | | **Rust** | 有潜力,但生态尚成熟,FFmpeg 绑定稳定,学习成本高 | > ✅ 当前趋势:**C++ 是底层引擎,Rust 正在追赶,其余语言做上层胶水** ---
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值