衡阳派盒市场营销有限公司

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

    文章

    652

    瀏覽量

    29458
  • 效率
    +關注

    關注

    0

    文章

    150

    瀏覽量

    20111
  • 性能
    +關注

    關注

    0

    文章

    271

    瀏覽量

    19040

原文標題:如何客觀評價 Go 語言?

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Go語言簡介和安裝方法

    Go 又稱 Golang ,是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種靜態強類型、編譯型語言Go 語言語法與
    發表于 07-19 16:33 ?586次閱讀

    Go語言中的整數類型

    Go 語言中,整型可以細分成兩個種類十個類型。
    發表于 07-20 15:25 ?968次閱讀

    音頻質量客觀評價中同步方法的研究與實現

    在音頻質量客觀評價,尤其是音頻系統的在線評測時,參考信號與測試信號不可避免地存在系統延遲。計算參考與測試之間的延遲誤差從而實現信號之間的時間同步將是影響音頻質量客觀評價結果的關鍵性問題
    發表于 03-12 00:24

    go語言能做什么工作?

    Go語言主要用作服務器端開發,其定位是用來開發“大型軟件”的,適合于很多程序員一起開發大型軟件,并且開發周期長,支持云計算的網絡服務。Go語言能夠讓程序員快速開發,并且在軟件不斷的增長
    發表于 03-22 15:03

    Go開發語言的優勢在哪里?

    Go語言是谷歌發布的第二款開源編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性,并專門針對多處理器系統應用程序的編程進行了優化,開發速度極快,可以與C或C++媲美,而且更加安全、支持并行
    發表于 03-22 15:04

    基于視覺信息保真度的圖像增強質量客觀評價方法_華東

    基于視覺信息保真度的圖像增強質量客觀評價方法_華東
    發表于 03-16 09:15 ?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 ?5245次閱讀

    Go語言在世界各地的使用情況如何?

    【導讀】Go語言在世界各地的使用情況如何?數據說話,帶你直觀感受什么叫“酷小孩都用的語言”! JetBrains 官方博客發表了一篇題為"The state of Go"的文章,他們通
    的頭像 發表于 02-26 14:10 ?4151次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>在世界各地的使用情況如何?

    詳解GO語言的趨勢與使用情況

    Go 語言簡單易學、性能優良。JetBrains Blog 發布了Go 語言的調查報告,看看GO 語言
    的頭像 發表于 03-17 11:05 ?3085次閱讀

    Go語言憑借什么成為云原生第一語言的?

    偶然看到有人說, Go 語言目前的火爆可能就是曇花一現而已。這個觀點我當然是不認同的。 近幾年,關于 Go 與 Java 還有 C 的對比和討論愈演愈烈,但不可否認的是,在十年多的時間里,Go
    的頭像 發表于 04-22 10:15 ?3230次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>憑借什么成為云原生第一<b class='flag-5'>語言</b>的?

    數字音頻質量主觀評價客觀評價并存的局面

    鑒于數字音頻質量主觀評價的局限性,數字音頻質量的客觀評價呼乎之欲出,形成主觀評價客觀評價并存的
    的頭像 發表于 06-17 15:11 ?2933次閱讀

    go語言枚舉類型怎么用

    go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細講解。 枚舉,是一種重要的數據類型,由一組鍵值對組成,通常用來在編程
    的頭像 發表于 09-02 09:43 ?5234次閱讀

    帶你了解go語言中的閉包

    ? 【 導讀】什么是閉包? 什么場景下會用閉包 ? 本文對 go 語言中的閉包做了詳細介紹。 閉包是由函數及其相關引用環境組合而成的實體(即:閉包=函數+引用環境)。 Go中的閉包 閉包是函數式
    的頭像 發表于 11-02 15:27 ?2497次閱讀

    go語言中怎么使用HTTP代理

    go語言中怎么使用HTTP代理。
    的頭像 發表于 09-01 14:41 ?2466次閱讀
    百家乐官网用品| 澳门百家乐官网的公式| 佳豪国际| 大发888在线体育官网| 大发888娱乐城 34hytrgwsdfpv| 大发888缺少casino组件common| 威尼斯人娱乐城博彩网站| 威尼斯人娱乐城澳门赌场| 边城棋牌游戏下载| 博士娱乐| 锦州市| 游戏房百家乐官网赌博图片| 百家乐官网打法介绍| 贝博百家乐官网的玩法技巧和规则 | 新利国际娱乐| 阿瓦提县| 百家乐官网永利娱乐城| 百家乐官网蓝盾有赢钱的吗| 百家乐官网追号工具| 百家乐冲动| 大发888娱乐城casinolm0| 大发娱乐场官方下载| 高阳县| 百家乐官网庄闲排列| 太阳城百家乐口诀| 威尼斯人娱乐城介| bet365娱乐城| 百家乐官网有不有作弊| 百家乐官网出庄的概率| 至尊百家乐qvod| 永利高足球网| 真人百家乐官网来博| 广州百家乐官网娱乐场开户注册 | bet365主页| 立即博百家乐官网现金网| 八大胜百家乐官网现金网| 明珠百家乐官网的玩法技巧和规则| 百家乐龙虎| bet365娱乐在线| 澳门百家乐官网怎洋赢钱| 百家乐翻天粤语版|