Gopher China 2021 講師專訪 — 曹春暉
曹大今年會在 Gopher China 大會上分享 Go 語言的搶占式調(diào)度,這也是他第一次作為講師出現(xiàn)在 Gopher China 的現(xiàn)場。這篇文章是 GoCN 對他做的采訪。
采訪中曹大風(fēng)趣幽默、針砭時弊,從他當(dāng)年的實習(xí)經(jīng)歷講到當(dāng)下公司使用 Go 的情況再到 Go 的未來,非常之精彩!當(dāng)然,我們更希望你能到大會現(xiàn)場聽曹大的分享。
曹大曾說:
你所要做的是提前做好準(zhǔn)備,在那一天到來的時候,在聚光燈下旁征博引,談笑風(fēng)生。
如今他就要實現(xiàn)了!
人這一輩子,最重要的是能把路越走越寬。也愿各位長風(fēng)破浪會有時,直掛云帆濟滄海!
最初如何與 Go 結(jié)識?在此之前,有無接觸過其他語言?談?wù)勊麄兊膬?yōu)缺點
在創(chuàng)業(yè)公司工作的時候,看到一個信息檢索模塊是 Go 寫的,當(dāng)時主要寫 PHP,也稍微寫過一點 C,被 Go 簡單直白的語法和高效的并發(fā)編程震撼到了。后來跳槽到滴滴就找機會慢慢從 PHP 轉(zhuǎn) Go 了。
我剛畢業(yè)的時候其實是從 C 開始寫的,被 void * 和 callback hell 折磨得死去活來,就投向了 PHP 的懷抱,結(jié)果發(fā)現(xiàn) PHP 在大公司有很多大項目,幾十萬行代碼,一樣非常難維護,那些幾千行代碼的接口連順暢地讀下來都很難,改起來同樣也很心虛。轉(zhuǎn)了 Go 以后,基本沒這種煩惱了,幾乎所有的項目讀代碼都很輕松,也很開心。
Go 語言中最看好哪種特性,談一談理由以及你希望它改進的方面
泛型,找再多不需要泛型的理由,你還是無法在沒有泛型的前提下既保證代碼重復(fù)少,又能做到類型安全。泛型到位之后,至少大家寫一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)庫能輕松很多,以前的這些庫是復(fù)制粘貼斷言漫天飛的。
希望的改進:個人現(xiàn)在最希望改進的是 if err != nil。造成了太多的代碼重復(fù),但是也不喜歡官方之前那個 try 方案,像某語言那樣的問號操作符就挺好的。要是能支持注解的話,做語言本身的擴展會方便很多(這一條感覺官方應(yīng)該不太會考慮)。
Go 語言對大廠和創(chuàng)業(yè)公司來說分別有什么優(yōu)越性?
大廠:對延遲敏感的業(yè)務(wù)(如高頻交易、廣告)是少數(shù),Go 對于 80% 的業(yè)務(wù)是適用的。大廠的單模塊代碼量都非常非常多(很多都 10w 行起了),相比 PHP 和 Python,這種規(guī)模的項目用 Go 寫,就是好維護。當(dāng)前使用 Java 的公司在上云后碰到了很多水土不服的問題,為了解決這些問題又需要付出更多技術(shù)上的努力(再說下去這段就不能播了)。而用 Go 上云還是比較省心的。
創(chuàng)業(yè)公司:買公有云是按用量算錢的,用的資源少就是省錢。就是這么現(xiàn)實。
Go 有沒有幫助解決公司的實際問題?
Go 在工程化上做了很多努力:
研發(fā)效率不好說,大家都有一些常見的代碼生成工具的話,其實差不多。但強類型語言,在項目中后期維護階段,肯定比那些 array 滿天飛的強。
官方直接把 parser 對用戶開放,做 linter 不要太方便,工程效率部門直接將 golangci-lint 拿到公司內(nèi)再針對業(yè)務(wù)場景做一些定制的 linter 就可以用起來了。
運維不用再考慮我給哪個業(yè)務(wù)用 PHP x.y 版本的問題了。
印象中某公司說從 PHP 遷移到 Go,能節(jié)省至少一半服務(wù)器吧(這句是傳說,我沒驗證過,各位 PHP fan 不要生氣)。
對眾多大廠轉(zhuǎn) Go 提一些建議吧,在選型上 Go 適用什么場景,不適用什么場景?
延遲敏感(廣告、高頻交易)類的場景用 Go 不合適,集中式的并發(fā)極高(幾 w QPS)的網(wǎng)關(guān)系統(tǒng)用 Go 不合適,大數(shù)據(jù)場景(已經(jīng)有現(xiàn)成的 Java/Scala SDK,Go 什么庫都沒有的那種)不適用。雖然一般會講 Go 的 stw 已經(jīng)控制在個位數(shù)毫秒以內(nèi)了,但實際請求的延遲不只受 stw 影響,所以在 POC 階段也應(yīng)該自己做一些壓測和數(shù)據(jù)驗證。除了上面講的,80% 的其它場景問題不大。
談一談 Go 的未來,將在哪些領(lǐng)域有更深的應(yīng)用?
Go 現(xiàn)在其實已經(jīng)是后端服務(wù)、分布式基礎(chǔ)組件、運維相關(guān)領(lǐng)域的主流語言了。個人傾向上希望能在泛型出現(xiàn)后能在數(shù)據(jù)領(lǐng)域(如實時計算)上稍微有一些拓展,但感覺可能比較難。
介紹下本次分享的議題吧
這次分享是 Go 1.14 的信號式搶占,之前看了作者在 GopherCon 上的分享,只是介紹了一些概念,相信完全沒有滿足大家的好奇心,這次我們就來詳細看看這個東西到底是怎么實現(xiàn)的。
分享一下如何快速掌握一門新的編程語言,分享一些經(jīng)驗給新 Gopher吧。學(xué)習(xí) Go 的最佳實踐是什么?推薦一些書吧!
要多動手,多抄代碼。比如看《The Go Programming Language》,能把書上所有的例子都抄明白,那就已經(jīng)入門了。入門以后,盡量結(jié)合工作多寫項目,還是從實踐中學(xué)習(xí)最靠譜。要是你對 cgo 啊,匯編什么的感興趣,歡迎買柴老板和我合著的《Go 語言高級編程》呀。其它的書,就買最暢銷的就完事了!
你是第幾次參加 GopherChina,對 GopherChina 大會有何期待?
應(yīng)該是第三還是第四次了,希望以后 GopherChina 能一直保持技術(shù)和應(yīng)用兩類主題并重,不要變成架構(gòu)師大會(笑
