0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何客观评价 Go 语言

Linux爱好者 来源:工程师李察 2019-04-25 14:18 次阅读

我是从 2015 年开始接触 Golang,并在之后开始在某出行公司的线上环境大规模使用,同时个人还利用个人时间深入研究过 Golang 的底层实现机制,包括内存管理、GC 机制、Runtime Scheduler、Interface、Channel 等。这篇文章力求客观的讨论一下 Golang 的利弊。

优点

1. 简单

简单应该是 Golang 最大的优势。Golang 的语言特性简单,学习周期短,熟悉其他编程语言的开发者基本都可以在短时间学会并写出各方面都还不错的代码。所谓各方面都还不错是说新手开发者写出来的代码和一些有经验的开发者写出来的代码差别并不会太大。

Golang 语言层面上的简洁性让一些新手程序员也能写出性能不错,bug 不多的程序,这个相比其他高级语言,比如 C++,是一个非常大的提升。MIT 的一个非常有名的课程 6.824 最开始使用功能的 C++,后来改成了 Golang,就是为了让大家可以专注于分布式算法本身,而不是陷入到语言细节的调试当中去。

2.兼顾开发效率和性能

Golang 由于丰富的原生库和周边生态的支持,开发效率甚至可以比肩 Python。很多公司早期,或者项目早期的时候为了赶开发进度都会将开发效率放在第一位,比如 Python,PHP 这种动态语言。但是动态语言的性能劣势非常明显。现在的一个好现象就是 Golang 已经越来越多的被小公司采用了,毕竟写一个 http server 不过三行代码。

另外在开发效率的前提下,Golang 还具有非常高的性能。这一方面得益于静态语言,另一方面和其本身的语言设计也有很多关系。但是这里说的非常高的性能有点不太严谨,相比 C++/Java 这种老牌的高级语言,在某些场景下的 benchmark 还是要略逊一筹的。

3. 语言级别的特性支持

所谓语言级别的并发支持,就是使用 go func 直接启动一个 goroutine,外加 select/chan 等周边。在没有语言级别的支持之前的异步编程简直就是 callback 噩梦。记得云风大神之前对 Golang 的一段评价:

我发现我花了四年时间锤炼自己用 C 语言构建系统的能力,试图找到一个规范,可以更好的编写软件。结果发现只是对 Go 的模仿。缺乏语言层面的支持,只能是一个拙劣的模仿。—— 云风

现在很多人使用一门新语言的时候,有时候还会问:“有对应的 coroutine 库吗?” Golang 的语言层面的支持极大的解放了开发者的心智负担。

缺点

1. runtime

支持 runtime 的编程语言一个无法绕开的问题就是 runtime 带来的一系列问题,比如性能损耗。在 rust 语言介绍自己的优势的时候有一点就是 no runtime。

Golang 的线程模型调度是 M:N,runtime 调度模型是 GMP 模型,伪抢占式的。简单点来说就是 runtime scheduler 可以类比成操作系统,但是缺乏硬件层面上对操作系统的支持,比如硬件中断,这就对 sheduler 的设计要求的非常高,但是 Golang 的实现并没有想象中的那么好。

2.并不能做到真正高并发高性能

Golang 的高并发使用原生库来实现的话一般都是通过多 goroutine + select/channel,但是我们看 channel 源码,发现这个东西就是一个队列+一把锁。这也就意味着无法避免多个 goroutine 带来的竞争问题。我之前测试过在多个 goroutine 竞争同一个 channel 的时候,性能急剧下降。所以很多高性能的高并发程序如果是用 Golang 来写,很多都会避免使用 channel 来传递数据,而是借用类似 disruptor 的 ringbuffer 技术。

但是这并不是说 Golang 在高并发场景下性能不行,对于日常的 io 密集型的 web server,可以说性能是足够了。

其他

这里谈一下 Golang 自问世以来一直被诟病的几个问题。

1. GC

大概从 1.0 版本以来,GC 就一直被诟病。值得欣慰的是,Golang 的 GC 一直在发展,基本在每个版本都有一定的改进。1.8 版本是 GC 的一个里程碑,使用并发三色标记法的 GC 算法的stw 时间甚至达到了微秒级。目前社区貌似在讨论分代 GC 的方案,这个后面专门写一篇文章细说。

2. 包管理

包管理也是一直被诟病,主要是一直没有一个官方的解决方案。直到去年官方终于开始有行动了,推出了 module,相对来说还是一个很不错的方案。

3.泛型

Golang 没有支持泛型的很大一个原因是泛型太复杂。尽管很多人说 interface 也能实现泛型功能,但是这个泛型还是有一些本质的区别的。没有泛型确实是一个减分项。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    571

    浏览量

    28574
  • 效率
    +关注

    关注

    0

    文章

    145

    浏览量

    19892
  • 性能
    +关注

    关注

    0

    文章

    265

    浏览量

    18815

原文标题:如何客观评价 Go 语言?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Go语言简介和安装方法

    Go 又称 Golang ,是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言Go 语言语法与
    发表于 07-19 16:33 408次阅读

    音频质量客观评价中同步方法的研究与实现

    在音频质量客观评价,尤其是音频系统的在线评测时,参考信号与测试信号不可避免地存在系统延迟。计算参考与测试之间的延迟误差从而实现信号之间的时间同步将是影响音频质量客观评价结果的关键性问题
    发表于 03-12 00:24

    Go语言开发有什么优势?怎么学?

      目前很多IT界的朋友们开始了学习Go这个语言,作为最近几年比较火的服务端开发语言,其开发效率高的特性,使得它迅速的占领了各大公司的服务端开发领域。相比其他服务端开发语言
    发表于 12-19 16:08

    go语言能做什么工作?

    Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长
    发表于 03-22 15:03

    Go开发语言的优势在哪里?

    Go语言是谷歌发布的第二款开源编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并专门针对多处理器系统应用程序的编程进行了优化,开发速度极快,可以与C或C++媲美,而且更加安全、支持并行
    发表于 03-22 15:04

    多传感器图像融合的客观评价与分析

    图像融合作为一种有效的信息融合技术, 已经广泛用于军事、遥感、机器视觉和医疗诊断等领域。这里研究了多传感器图像 融合效果的客观评价方法, 其中包括均方根误差、平均误差
    发表于 07-11 10:23 18次下载

    D语言,Go语言,Rust语言优势分析

    和Rust在取代C/C++语言的优劣势,以及这三种语言的未来。 以下为译文: 作为D语言的联合创始人之一,尽管我的身份来回答这个问题显得有点不合适,但是我仍会尽可能客观地回答这个问题。
    发表于 10-13 11:11 0次下载

    一种新的HDR图像客观质量评价方法

    针对当前高动态范围( HDR)图像质量评价方法未考虑图像色度和结构信息的问题,提出了一种新的HDR图像客观质量评价方法。首先,利用HDR-VDP-2.2中的基于视觉感知的模型得到关于亮度与对比度
    发表于 12-05 18:58 3次下载
    一种新的HDR图像<b class='flag-5'>客观</b>质量<b class='flag-5'>评价</b>方法

    网易有道CEO周枫推荐Go语言并介绍Go语言的3个优点

    网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;
    的头像 发表于 01-31 14:11 4957次阅读

    详解GO语言的趋势与使用情况

    Go 语言简单易学、性能优良。JetBrains Blog 发布了Go 语言的调查报告,看看GO 语言
    的头像 发表于 03-17 11:05 2791次阅读

    数字音频质量主观评价客观评价并存的局面

    鉴于数字音频质量主观评价的局限性,数字音频质量的客观评价呼乎之欲出,形成主观评价客观评价并存的
    的头像 发表于 06-17 15:11 2448次阅读

    go语言枚举类型怎么用

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据类型,由一组键值对组成,通常用来在编程
    的头像 发表于 09-02 09:43 4875次阅读

    详细介绍go语言中的闭包的实现

    什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式语言
    的头像 发表于 10-20 16:18 1673次阅读

    带你了解go语言中的闭包

      【 导读】什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式
    的头像 发表于 11-02 15:27 2177次阅读

    go语言中怎么使用HTTP代理

    go语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:41 2164次阅读