乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       Levy_X 2017-06-20


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

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


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


      Go 語言使用場景相關(guān)的問題


      Go 的主要使用場景:

      · 主要場景有很多,比如網(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)類系統(tǒng)(微服務(wù)網(wǎng)關(guān))、數(shù)據(jù)庫代理器、基礎(chǔ)服務(wù)等的開發(fā),只要有高并發(fā)高可用需求的服務(wù)端程序都可以用 Go 開發(fā)。


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


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


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


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

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


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


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


      Go 作為系統(tǒng)編程語言意在取代 C/C ,請問有哪些系統(tǒng)編程使用場景?

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


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

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


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


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

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


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

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



      Go 語言的優(yōu)勢


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

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


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


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


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


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


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

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


      Rust 沒有 GC,Nim 有 GC 但編譯成 C 性能更好,請問 Golang 在和 Rust、Nim 的競爭中會逐漸處于弱勢嗎?

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


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


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


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

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


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


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

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


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


      Go 語言支持多線程嗎?

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



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


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

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


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


       谷歌會不會部署 pip、npm 這樣的中心倉庫來推動 Go 的發(fā)展?感覺目前 Go 的管理太過松散了。

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


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

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


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


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

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


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



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


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

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


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

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


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



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

      · 在語言層面有官方的 cgo。


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


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

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


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


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

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


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


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

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


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


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

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


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


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

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


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


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

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


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

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


      · Intellj IDEA Go plugin 也是不錯的選擇


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

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


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

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



      其他相關(guān)問題

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

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


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


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


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

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


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



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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多