日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Go 語(yǔ)言 —— 云計(jì)算時(shí)代的 C 語(yǔ)言 | 高手問(wèn)答精選

 Levy_X 2017-06-20


本文根據(jù)高手問(wèn)答 Go 并發(fā)編程實(shí)戰(zhàn)整理成文

鏈接:https://www.oschina.net/question/2720166_2238677


Go 語(yǔ)言被稱(chēng)為云計(jì)算時(shí)代的 C 語(yǔ)言,它在軟件開(kāi)發(fā)效率和運(yùn)行效率之間做出了絕佳的權(quán)衡。這使得它既適應(yīng)于互聯(lián)網(wǎng)應(yīng)用的極速開(kāi)發(fā),又能在高并發(fā)、高性能的開(kāi)發(fā)場(chǎng)景中如魚(yú)得水。正因如此,許多互聯(lián)網(wǎng)公司,尤其是云計(jì)算領(lǐng)域的創(chuàng)業(yè)公司都選擇 Go 語(yǔ)言作為其技術(shù)棧的重要組成部分。因此,對(duì)于廣大的開(kāi)發(fā)者而言,關(guān)注和學(xué)習(xí) Go 語(yǔ)言就十分有必要了。


Go 語(yǔ)言使用場(chǎng)景相關(guān)的問(wèn)題


Go 的主要使用場(chǎng)景:

· 主要場(chǎng)景有很多,比如網(wǎng)絡(luò)編程,包括 Web 系統(tǒng)、API 應(yīng)用、下載應(yīng)用、游戲后端,以及各種服務(wù)器編程,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng),等等。相關(guān)的項(xiàng)目在 GitHub 上十分多,也可以參考:https://github.com/GoHackers/awesome-go-China


· 除了這些,Go 還適合分布式系統(tǒng)、網(wǎng)關(guān)類(lèi)系統(tǒng)(微服務(wù)網(wǎng)關(guān))、數(shù)據(jù)庫(kù)代理器、基礎(chǔ)服務(wù)等的開(kāi)發(fā),只要有高并發(fā)高可用需求的服務(wù)端程序都可以用 Go 開(kāi)發(fā)。


· 內(nèi)存數(shù)據(jù)庫(kù),谷歌開(kāi)發(fā)的 groupcache,couchbase 的部分組建。


· 云平臺(tái),目前國(guó)外很多云平臺(tái)采用 Go 開(kāi)發(fā),CloudFoundy 的部分組建。


· 另外 IoT 方面有 Gobot 框架,移動(dòng)開(kāi)發(fā)方面也有官方的解決方案(雖然還有待進(jìn)一步發(fā)展)。


Go 在大數(shù)據(jù)領(lǐng)域的應(yīng)用,以及在大數(shù)據(jù)領(lǐng)域的應(yīng)用(海量存儲(chǔ),批處理,流處理,數(shù)據(jù)預(yù)測(cè)等方面)有哪些比較看好的開(kāi)源或商業(yè)項(xiàng)目嗎?

· 在數(shù)據(jù)挖掘(尤其是爬蟲(chóng))、數(shù)據(jù)分析、數(shù)據(jù)存儲(chǔ)方面,Go 都非常適合。在 GitHub 上邊有很多這方面的庫(kù),尤其是挖掘和存儲(chǔ)方面。(國(guó)產(chǎn)的有很多,比如:pholcus(爬蟲(chóng))、TiDB(存儲(chǔ))等等)。


· 海量存儲(chǔ)有很多,比如 InfuxDB、CockroachDB、TiDB。其他方面在 GitHub 上也有很多開(kāi)源項(xiàng)目,不一一列舉了。不過(guò)商業(yè)的項(xiàng)目目前并不多見(jiàn)。


· 在大數(shù)據(jù)領(lǐng)域,Go 和 Python 也是十分優(yōu)秀的組合。


Go 作為系統(tǒng)編程語(yǔ)言意在取代 C/C ,請(qǐng)問(wèn)有哪些系統(tǒng)編程使用場(chǎng)景?

誰(shuí)也取代不了誰(shuí),誰(shuí)也不會(huì)被輕易取代,只能說(shuō)在新的時(shí)代更加適合做基礎(chǔ)性的工作,“云計(jì)算時(shí)代的C語(yǔ)言”的意思是在云計(jì)算時(shí)代更適合做基礎(chǔ)性的工作,實(shí)際情況也印證了這一點(diǎn)。我們可以用 Go 輕易編寫(xiě)系統(tǒng)級(jí)的基礎(chǔ)命令,也可以用 Go 編寫(xiě)軟件替代 C/C 軟件,比如 Caddy 可以替代 Nginx,等等。


目前很多電商平臺(tái)是用 PHP 開(kāi)發(fā)的,Go 適合做電商平臺(tái)的開(kāi)發(fā)語(yǔ)言嗎?

· 我司就用 Go 寫(xiě)了 API 網(wǎng)關(guān)、基礎(chǔ)服務(wù)和基礎(chǔ)組件,以及一些需要較高性能的應(yīng)用級(jí)系統(tǒng),都是全局性的基礎(chǔ)系統(tǒng)。優(yōu)勢(shì)很明顯,在開(kāi)發(fā)效率和運(yùn)行效率上都可以滿(mǎn)足要求,而且綽綽有余。


· 電商用 PHP 主要都是因?yàn)殚_(kāi)發(fā)快,但是從節(jié)省運(yùn)維成本和提高運(yùn)行效率的角度講,Go 也是很不錯(cuò)的選擇。PHP 更容易做頁(yè)面渲染,而 Go 更擅長(zhǎng)做并發(fā)任務(wù)處理。在我司是這么劃分的。PHP 在某些任務(wù)的開(kāi)發(fā)效率上可能更高,但是程序運(yùn)行效率是比不上 Go 的。


人工智能之類(lèi)的有名的項(xiàng)目,目前沒(méi)有是 Go 做的,如何用 Go 做人工智能?

Go 語(yǔ)言由于 Google 的推動(dòng)進(jìn)入 AI 領(lǐng)域是必然的。目前 Go 做人工智能相關(guān)的工作主要是搭 Tensorflow 的車(chē),因?yàn)樯疃葘W(xué)習(xí)框架 Tensorflow 已經(jīng)有 Go 的 API 了。相信 Go 會(huì)逐漸成為主要角色的。


創(chuàng)業(yè)公司都選擇 Go 語(yǔ)言作為其技術(shù)棧合適嗎?

現(xiàn)在有很多公司都這么做,不過(guò)一個(gè)技術(shù)型公司一般不會(huì)只選用一種語(yǔ)言作為基礎(chǔ)技術(shù)棧的。我推薦創(chuàng)業(yè)團(tuán)隊(duì)選用 Go 語(yǔ)言作為其基礎(chǔ)技術(shù)棧(之一)。



Go 語(yǔ)言的優(yōu)勢(shì)


Go 有什么優(yōu)勢(shì):

· 部署簡(jiǎn)單:Go 編譯生成的是一個(gè)靜態(tài)的可執(zhí)行文件,除了 glibc 外沒(méi)有其他外部依賴(lài)。這讓部署變得異常方便


· 并發(fā)性好:語(yǔ)言層面支持并發(fā),這個(gè)是 Go 最大的特色。Goroutine 和 channel 使得編寫(xiě)高并發(fā)的服務(wù)端軟件變得十分容易,很多情況下不需要考慮鎖機(jī)制以及由此帶來(lái)的各種問(wèn)題。


· 良好的語(yǔ)言設(shè)計(jì):從工程的角度看,Go 的規(guī)范簡(jiǎn)單靈活,自帶完善的工具鏈,例如 gofmt 可自動(dòng)排版代碼


· 執(zhí)行性能好:適合編寫(xiě)瓶頸業(yè)務(wù),非常節(jié)省內(nèi)存


· 豐富的標(biāo)準(zhǔn)庫(kù):內(nèi)置了大量的庫(kù),還有強(qiáng)大的網(wǎng)絡(luò)庫(kù)


Go 語(yǔ)言相比 Java、PHP 這類(lèi)時(shí)下用得最廣的語(yǔ)言在執(zhí)行速度跟并發(fā)編程上優(yōu)勢(shì)很明顯,除了這兩點(diǎn)外,Go 還有別的優(yōu)勢(shì)嗎?

工程化能力、開(kāi)發(fā)和運(yùn)行效率上的權(quán)衡是 Go 很突出的兩個(gè)特色。這兩方面初看沒(méi)什么,但細(xì)究起來(lái)真正是為軟件工程的實(shí)施準(zhǔn)備的,能起到非常大的作用。當(dāng)一個(gè)團(tuán)隊(duì)去做一大坨項(xiàng)目或者很大的工程的時(shí)候,優(yōu)勢(shì)還是很明顯的。


Rust 沒(méi)有 GC,Nim 有 GC 但編譯成 C 性能更好,請(qǐng)問(wèn) Golang 在和 Rust、Nim 的競(jìng)爭(zhēng)中會(huì)逐漸處于弱勢(shì)嗎?

· 看一門(mén)語(yǔ)言要看它的“干爹”、生態(tài)建設(shè)和發(fā)展歷史。Nim的語(yǔ)法我也很喜歡,但是沒(méi)有大公司支持,發(fā)展沒(méi)有保障。


· Rust 也是一門(mén)很不錯(cuò)的語(yǔ)言,基本上是純社區(qū)支持,但是學(xué)習(xí)門(mén)檻很高,生態(tài)也不是太萬(wàn)重山,需要觀(guān)望。


· 對(duì)于我來(lái)說(shuō),Go 非常適合技術(shù)團(tuán)隊(duì)使用。當(dāng)然,如果只是把玩的話(huà) Nim 還是很不錯(cuò)的,如果想鍛煉心智 Rust 也是一個(gè)很不錯(cuò)的選擇。


Go 語(yǔ)言和 Python 相比,感覺(jué) Python 語(yǔ)言在云計(jì)算、數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)更加有優(yōu)勢(shì)??戳撕枚鄼C(jī)器學(xué)習(xí)的庫(kù)都有 Python 版本的而沒(méi)有 Go 版本的。一直聽(tīng)說(shuō) Go 語(yǔ)言的性能比 Python 強(qiáng)悍,不知道具體哪方面強(qiáng)于 Python。

· Go 語(yǔ)言已經(jīng)涉足數(shù)據(jù)挖掘領(lǐng)域,正在開(kāi)始涉足數(shù)據(jù)分析和機(jī)器學(xué)習(xí)領(lǐng)域。


· 性能強(qiáng)是肯定的,只考慮解釋型語(yǔ)言與編譯型語(yǔ)言的差別就可以斷定性能差別,更何況 Go 語(yǔ)言的性能在編譯型語(yǔ)言中也是佼佼者??梢宰约河貌煌Z(yǔ)言寫(xiě)同一個(gè) Web Server 測(cè)試一下。


相比于 Python、Perl、Ruby 等后端開(kāi)發(fā)語(yǔ)言,Go 有哪些優(yōu)勢(shì)呢?

· 與腳本語(yǔ)言相比,Go 的優(yōu)勢(shì)很明顯 — 性能好。當(dāng)然,缺點(diǎn)就是語(yǔ)法糖太少,不過(guò)這也是 Go 的工程化理念的一種體現(xiàn)。


· Go 的并發(fā)編程模型是非常獨(dú)特的,它省去了開(kāi)發(fā)者自己去處理復(fù)雜的并發(fā)處理場(chǎng)景。這一點(diǎn)非常值得廣大開(kāi)發(fā)者研習(xí)。


Go 語(yǔ)言支持多線(xiàn)程嗎?

Go 語(yǔ)言在內(nèi)核線(xiàn)程之上構(gòu)建了用戶(hù)級(jí)線(xiàn)程機(jī)制和模型,可以說(shuō) Go 的并發(fā)模型就是建立在內(nèi)核線(xiàn)程之上的。Go 完美地包裝了傳統(tǒng)的多線(xiàn)程編程模型,并且有效屏蔽了多線(xiàn)程編程的復(fù)雜度。



Go 語(yǔ)言生態(tài)發(fā)展相關(guān)的問(wèn)題


 Go 2.x 可能會(huì)有哪些變化?你認(rèn)為泛型等高級(jí)語(yǔ)法,Go 會(huì)支持嗎?

· 現(xiàn)在談 Go 2.x 還太早,你可以到 GitHub 上的 Go 官方項(xiàng)目中搜索帶 go2 標(biāo)簽的 issue。不過(guò)即使這樣也無(wú)法完全推測(cè) Go 2.x 的確切特性集合。


· Go 發(fā)布 2.x 的時(shí)候會(huì)支持范型,就我個(gè)人而言,最希望添加的特性也是泛型,但并不是沒(méi)有泛型就不行。


 谷歌會(huì)不會(huì)部署 pip、npm 這樣的中心倉(cāng)庫(kù)來(lái)推動(dòng) Go 的發(fā)展?感覺(jué)目前 Go 的管理太過(guò)松散了。

Go 官方正在開(kāi)發(fā)第三方依賴(lài)管理工具 dep,但沒(méi)聽(tīng)說(shuō)準(zhǔn)備開(kāi)發(fā)類(lèi)似 maven 的工具,不過(guò)后者其實(shí)可以很容易通過(guò) dep(或glide) 自制中轉(zhuǎn)站 GitLab 來(lái)滿(mǎn)足大部分需要。


Java 的生態(tài)非常繁榮,Go 在生態(tài)建設(shè)方面發(fā)展如何?

· Go 的生態(tài)的優(yōu)勢(shì)目前還是在云計(jì)算、微服務(wù)和數(shù)據(jù)挖掘,正在向機(jī)器學(xué)習(xí)等新興領(lǐng)域延伸。據(jù)我所知,一些機(jī)器學(xué)習(xí)和機(jī)器人領(lǐng)域的創(chuàng)業(yè)公司已經(jīng)在使用它了。


· 作為使用人數(shù)較多的國(guó)家,Go 在我們國(guó)內(nèi)的發(fā)展勢(shì)頭非常好。無(wú)論大公司還是創(chuàng)業(yè)公司,使用 Go 的比例在不斷增大。


Golang 會(huì)取代 Java 的地位嗎?未來(lái) Go 的發(fā)展前景如何?

· 基礎(chǔ)技術(shù)棧是很難被取代的。我們應(yīng)該采取開(kāi)放的心態(tài),多個(gè)技術(shù)棧并行使用。


· 有著 Google 引領(lǐng)的技術(shù)潮流,Go 應(yīng)該會(huì)有著很好的發(fā)展前景。



Go 使用過(guò)程中的相關(guān)問(wèn)題:


之前了解到 Go 的 GC 機(jī)制存在缺陷,會(huì)導(dǎo)致服務(wù)進(jìn)程阻塞,并發(fā)機(jī)制短暫失效,這個(gè)問(wèn)題在 1.8 中有解決嗎?

早在 Go 1.4,Go 官方就已經(jīng)開(kāi)始著手改進(jìn) GC 了,經(jīng)過(guò)這么多版本的努力,至今的 GC 已經(jīng)完全不是問(wèn)題了,具體介紹請(qǐng)見(jiàn):http://www./cn/articles/2016-review-go


Golang 運(yùn)行時(shí)是包含 runtime 的,也是擁有垃圾回收的,與傳統(tǒng)的 Java 相比性能有優(yōu)勢(shì)么?您在使用 Golang 語(yǔ)言的過(guò)程中遇到過(guò)那些問(wèn)題呢?

· 關(guān)于對(duì)比,你可以參考這篇文章:https://making./golangs-real-time-gc-in-theory-and-practice


· Go 語(yǔ)言以前被人詬病的是 GC 造成的調(diào)度停頓時(shí)間太長(zhǎng),但是現(xiàn)在已經(jīng)完全不是問(wèn)題了。



Golang 可以通過(guò)什么方式與其他語(yǔ)言進(jìn)行交互,取長(zhǎng)補(bǔ)短呢?

· 在語(yǔ)言層面有官方的 cgo。


· 不過(guò)建議使用基于通用協(xié)議的方式進(jìn)行交互,比如 thrift、grpc 等,異構(gòu)系統(tǒng)就是這么來(lái)的。


Go 語(yǔ)言使用消息傳遞的方式實(shí)現(xiàn)并發(fā),同時(shí)也是支持同步鎖并發(fā),請(qǐng)問(wèn) channel 方式和同步鎖方式的優(yōu)缺點(diǎn);Go 語(yǔ)言目前通道是在單應(yīng)用內(nèi),后續(xù)是否可以支持分布式通道開(kāi)發(fā)呢?

· channel 更符合 Go 的風(fēng)格,被傳輸?shù)闹禃?huì)被復(fù)制,所以一般來(lái)說(shuō)很安全,鎖的適用場(chǎng)景一般是封裝并發(fā)安全對(duì)象或者保護(hù)全局變量。channel 最大的優(yōu)勢(shì)是讓并發(fā)編程非常方便和清晰,缺點(diǎn)是稍微比鎖重一些。


· 分布式通道的其實(shí)可以用很多第三方框架或軟件實(shí)現(xiàn),比如 gPRC、Thrift 或者各種 MQ。


 Go 開(kāi)發(fā)中有什么坑或注意點(diǎn)?例如因?yàn)楦渌R?guī)語(yǔ)言的編程或設(shè)計(jì)思路不同,而容易導(dǎo)致錯(cuò)誤的使用。

· 簡(jiǎn)要說(shuō)一下,在使用 slice類(lèi)型、channel類(lèi)型、go語(yǔ)句、defer語(yǔ)句、函數(shù)傳參、變量賦值、接口運(yùn)用等方面都有一些需要注意的地方。例如,一個(gè) slice 值的底層數(shù)組在什么情況下是什么樣子的,知道了這個(gè)才能更好地運(yùn)用 slice。


· 又例如,怎樣操縱 channel 值才能避免阻塞或 panic。


Go 的一些模塊比較慢,比如 Go 的 log,json 部分都有些慢,請(qǐng)問(wèn)生產(chǎn)環(huán)境只能用一些第三方來(lái)替代么?關(guān)于這里踩過(guò)哪些坑,你們又是如何填坑的呢?

· log 也是 IO,所以必然慢,這需要在性能和日志完備性方面做權(quán)衡。在很多時(shí)候,日志的內(nèi)容需要仔細(xì)斟酌。慢一般有兩方面原因,一個(gè)是有計(jì)算量(直接原因),一個(gè)是有額外內(nèi)存分配(間接原因),需要從這兩方面優(yōu)化。


· 另外我們是在 logrus 和 Uber 的 zap 上簡(jiǎn)單的封裝了一層,統(tǒng)一接口,前者擴(kuò)展性好,后者性能較好。json 這塊其實(shí)我們還是用的官方方案,不過(guò)有些簡(jiǎn)單 json 就直接拼接字符串了,性能會(huì)好一些。


 并發(fā)和并行有些區(qū)別,請(qǐng)問(wèn)寫(xiě)出真正并行的程序有什么建議呢,現(xiàn)在只是配置下 GOMAXPROCS。

· Go 1.5 以后就不用設(shè)置這個(gè)環(huán)境變量了,默認(rèn)值與當(dāng)前機(jī)器的邏輯 CPU 數(shù)量相同,可以充分利用多核計(jì)算。


· 用 Go 語(yǔ)言寫(xiě)程序只要關(guān)注怎么并發(fā)就行了,并行的事情交給 runtime。但是與很多技術(shù)一樣,需要知道底層的原理才能更好的搭建上層建筑。


Go 的底層是如何實(shí)現(xiàn)“鴨子模式”的,原理是什么?對(duì)性能是否有影響?

· 你可以看一下這里 https:///doc/faq#guarantee_satisfies_interface,具體的方式可以閱讀 Go 編譯器的源碼。


· 當(dāng)然會(huì)有性能影響,但是寫(xiě)程序和做軟件一定要考慮維護(hù)期(生命周期的 90%),要有良好的設(shè)計(jì)。這很重要。另外,把一個(gè)非接口類(lèi)型(且非指針類(lèi)型)的值賦給一個(gè)接口類(lèi)型的變量會(huì)產(chǎn)生新的內(nèi)存分配。這點(diǎn)需要注意。


Go 的包管理有什么好的成熟方案嗎?

Go 官方在做一個(gè)叫 dep 的官方解決方案,但是正式放出還有一段時(shí)間。在這之前,我個(gè)人首推 Glide,另外 gb 在一些情況下也是適用的。


有什么比較強(qiáng)大的 Go 開(kāi)發(fā)工具?

· 個(gè)人覺(jué)得圖形化的開(kāi)發(fā)工具中,VS Code、gogland、LiteIDE 都比較好用


· Intellj IDEA Go plugin 也是不錯(cuò)的選擇


書(shū)中有 Go Tool Trace 的使用么,求推薦 Golang 各種 tool 的教程說(shuō)明,pprof、cpu、內(nèi)存、競(jìng)態(tài)條件等。

書(shū)中并沒(méi)有 Go Tool Trace 的使用方法,我另外有一份免費(fèi)的 Go 命令教程,地址是: https://github.com/gohackers/go_command_tutorial。這份教程上有大多數(shù) Go 命令的使用介紹,但是由于精力有限,沒(méi)有 Go Tool Trace 的使用方法。我也希望能有 gopher 幫我完善這份教程。當(dāng)然,一旦我有時(shí)間也會(huì)去補(bǔ)上。


 在 Windows 環(huán)境下,想輸出 GC 信息,CMD 中:set GODEBUG=gctrace=1 mygoapp.exe,這樣并沒(méi)有信息輸出。

請(qǐng)參考 https:///pkg/runtime/#hdr-Environment_Variables。另外你要確認(rèn)環(huán)境變量是否設(shè)置正確。



其他相關(guān)問(wèn)題

目前做 Java 開(kāi)發(fā),但是非常喜歡Go,準(zhǔn)備轉(zhuǎn)到 Go,對(duì)于國(guó)內(nèi) Go 的行情您認(rèn)為怎樣?有什么要注意的?

· 行情肯定是沒(méi)有 Java 和 PHP 好,但是正在快速向前沖。如果你真心喜歡 Go 語(yǔ)言,建議找一個(gè)專(zhuān)職的 Go 開(kāi)發(fā)工作。當(dāng)然,在目前崗位上直接用 Go 去寫(xiě)一些東西、完成一些任務(wù),是更穩(wěn)妥的辦法。把這門(mén)技術(shù)應(yīng)用于實(shí)際、產(chǎn)生價(jià)值,才是最重要的。


· 主要需要注意設(shè)計(jì)和編寫(xiě)程序的方式,Java 太 OO 了,所以 Java 程序員很容易陷入 OO 思想不能自拔,其實(shí)除了 OO 還有其他優(yōu)秀的編程思想。BTW,我當(dāng)初就是從 Java 轉(zhuǎn)過(guò)來(lái)的。


· 關(guān)于編程思想的轉(zhuǎn)變方面,還可以參考一位 Go 大牛博客 http:///2017/04/20/go-coding-in-go-way 中的內(nèi)容。


之前用了五六年的 C#,后來(lái)轉(zhuǎn)成 Node.js 開(kāi)發(fā),到現(xiàn)在有三年了,使用 Go 開(kāi)發(fā)相比 Node.js 有什么優(yōu)勢(shì)?有必要學(xué)習(xí) Go 語(yǔ)言嗎?

· 如果你厭惡 Node.js 的 callback hell,可以毅然決然的轉(zhuǎn) Go,Go 的并發(fā)編程模型會(huì)大大降低開(kāi)發(fā)者的心智負(fù)擔(dān),讓你輕松開(kāi)發(fā)并發(fā)程序。


· 此外,Go 的程序設(shè)計(jì)哲學(xué)與 Unix 的哲學(xué)很相近,工程化的理念也非常值得吸納。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多