Go與C#的比較 - Reddit

banq發表於2022-04-30

我目前用這兩種語言程式設計,而且我確實喜歡這兩種語言--這是我最喜歡的兩種程式語言,而且我覺得這兩種語言都是我學習過程中的重要入門。

C#
有很多語法糖,雖然它可以(而且經常被)濫用,但可以減少很多操作的冗長性。尤其是開關表示式、三元操作符、模式匹配、空值檢查和lambda表示式。
我喜歡Web APIs的內建模型繫結,它為你處理了很多模板轉換和型別檢查。
我喜歡許多東西可以用屬性(Attributes)來標記,這些屬性可以用來做各種事情,比如指定轉換、驗證等等。(go也有這個功能,但只適用於結構成員)。
泛型是非常強大的。

從壞的方面來說,C應用程式的可移植性要差得多,因為你需要執行時和所有的依賴庫來使你的應用程式工作。
當我試圖為QA或其他團隊成員製作工具時,我就被這個問題所困擾,因為他們從來沒有安裝過最新的執行時,而在Go中,我只需要給他們一個二進位制檔案。

在生態系統中,有很多不良的做法,這些做法源於對SOLID和 "模式 "程式設計的嚴格遵守,這些做法增加了更多的複雜性,而不是你用語言特性節省下來的,並且由於不斷地在堆上噴射新的物件,到處都是虛擬呼叫,以及IEnumerable的緩慢延遲執行,而消耗了效能。

必須明確地寫出async/await,這只是浪費時間。
LINQ是很好的,但是導致人們根本不考慮資料結構,導致很多效能不好的程式碼,並且有一些問題。

當用於網路程式設計時,通常你只是在緩慢的事物之間協調資料流,所以效能最終會足夠快,不會成為瓶頸。

庫和框架都是經過編譯的,而且通常是閉源的,所以更難看到引擎蓋下發生了什麼,導致 "神奇 "的功能可能難以理解和除錯。

C#有很多方法可以將複雜的功能隱藏在看似良性的操作背後,這可能會使效能的推理變得非常困難,也會讓你對bug感到驚訝。

GO
我喜歡它對簡單性的關注,以及更接近事物在較低層次的工作方式。
在Go上工作無疑幫助我更好地理解了一些概念,特別是 "引用型別 "到底是什麼,因為 "引用 "是顯式的,資料結構和分配如何影響效能,以及不同行為的成本。

我必須做不同的事情才能在Go中獲得可讀的程式碼,這一點我也能運用到其他語言中。
Go的理念通常會使程式碼更容易推理,更容易知道發生了什麼,而且通常也更有效能。

該語言中的想法一般都非常優雅。Go庫是開源的,所以很容易知道某些東西在做什麼,並在出錯時進行故障排除。

Go的網路庫不支援一些在.Net中可以做到的語法特性,但仍然是完整的。

Go通常非常快,儘管我懷疑這很大程度上是由於語言的簡潔性造成的,通常較少的LOC會導致較快的程式碼。

Go應用程式的可移植性很強,我甚至能夠在Windows上可靠地構建Linux二進位制檔案。Async/await是自動的。

在缺點方面,Go似乎過於簡單。
程式碼在有很多錯誤和/或條件的地方會變得相當冗長。
Go有一些語法糖的方式最終並不那麼有用,例如,我幾乎沒有發現`if`塊中的額外語句能提高可讀性。
錯誤處理比異常處理更直接,但通常比許多人認為的更冗長。

Go的一些選擇是很奇怪的,比如它被作為一種系統語言來銷售,但它限制了對系統apis和primitives的訪問,不能真正用於系統程式設計,是垃圾收集的,有很少的本徵,而且編譯器不能很好地優化(沒有自動向量),所以不能用於 "真正的 "高效能軟體(至少,如果不在ASM中寫熱迴圈)。

除了像C/C++這樣的 "真正的 "系統語言外,它仍然比其他任何語言快得多,但我必須根據作者的說法來判斷。

對慣例/結構的有限指導會使你很難知道你所做的事情是否 "好",但總的來說,我還是寧願用結構不好的Go程式碼工作,而不是其他大多數語言。泛型也比C的弱很多--這不一定是壞事,因為它們在有泛型的語言中經常被濫用。

在我自己的專案中,我一直選擇Go,主要是因為在Go中工作時缺乏摩擦,但也因為我的個人目標是學習更多低階別的東西。Go絕對教會了我很多東西,雖然它不是一種 "完美 "的語言,但它是最好的語言之一,我絕對會向任何想要學習的人推薦它。

遷移經驗
我們有一個小的開發團隊,我們實際上把我們的API/Web堆疊從整個.Net 4.5/dotnet core 2.1/3遷移到Nuxt.JS + Golang。

我在舊的技術棧上工作了3年左右,新技術棧在生產中使用了3年左右。因此,我們有很多經驗,知道什麼是有效的,為什麼我們要轉移,以及我們現在的情況。

---

根據你的團隊的使用情況,從C#/dotnet遷移會給你的工作增加一些複雜性。我不認為有一個明確的方法是最好的方法,真正的方法是你的團隊感到舒適並喜歡用它來編寫軟體。

有些時候我很懷念dotnet的Razor頁面/全SSR時代。我認為框架的編寫方式非常簡單,併為 "包括電池 "的哲學提供了價值。Golang的html/template庫也很好,但有時會導致寫更多的自定義程式碼,而這對於一個小企業來說是很難維護的。

在Go方面,我一般喜歡Go。我認為,只要你採用好的模式,並堅持一個計劃來編寫一致的程式碼,它的閱讀和編寫一樣有趣。我對太多的程式語言沒有這種感覺。

---

這兩種語言都很容易進行單元測試,並且可以移植到各個地方使用(伺服器、Lambda、CLI等)。兩者都不會出錯,因為到最後你會學到一些模式(Web伺服器/HTTP/Rest/GraphQL,DB連線,CLI流程等),這些都與你選擇的語言或框架無關。只要選擇能給你帶來最大快樂的那個,你就不會出錯。

 

相關文章