Go與C#的比較 - Reddit
我目前用這兩種語言程式設計,而且我確實喜歡這兩種語言--這是我最喜歡的兩種程式語言,而且我覺得這兩種語言都是我學習過程中的重要入門。
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流程等),這些都與你選擇的語言或框架無關。只要選擇能給你帶來最大快樂的那個,你就不會出錯。
相關文章
- Rust, Go與Hasekll比較 - RedditRustGo
- Goland與vscode比較 - redditGoLandVSCode
- Go 與 C++ 的對比和比較GoC++
- C# DataRow 比較C#
- Go和Python比較的話,哪個比較好?GoPython
- 【C#】比較 Random 與 RandomNumberGenerator 生成隨機字串C#random隨機字串
- Go語言的Web框架比較GoWeb框架
- Rust與Go在區塊鏈中的應用比較 - definoobsRustGo區塊鏈
- Go與Node.js在網站應用上的效能比較GoNode.js網站
- 關於Go tools的比較有用的flagsGo
- C# 雜湊表Hashtable與字典表Dictionary<K,V>的比較。C#
- C#中各種Lock的速度比較C#
- C#比較dynamic和Dictionary效能C#
- Java,Go和Rust之間的比較 - DexterJavaGoRust
- PostgreSQL與MySQL的比較 - hackrMySql
- MVVM與MVC模式的比較MVVMMVC模式
- XTask與RxJava的使用比較RxJava
- JavaScript 與 Java、PHP 的比較JavaScriptPHP
- Hadoop與Spark的比較HadoopSpark
- CMM/CMMI 與敏捷的比較敏捷
- Hibernate與 MyBatis的比較MyBatis
- CoffeeScript與Ruby的比較
- Vue與React比較VueReact
- 【Redis與Memcached比較】Redis
- RecyclerView與ListView比較View
- js與jq比較JS
- PostgreSQL與MySQL比較MySql
- Vuex與Redux比較VueRedux
- [C#] string 和 StringBuilder 的比較C#UI
- C#比較兩個字串的相似度【轉】C#字串
- c#中結構體和類的比較C#結構體
- Go中泛型和反射比較指南Go泛型反射
- 網上體育彩票行業的程式語言:Go與Erlang/Elixir比較行業Go
- oracle中字串的大小比較,字串與數字的比較和運算Oracle字串
- Flutter與React Native的比較FlutterReact Native
- Docker 與 Podman 容器管理的比較Docker
- OSI模型 與 DOD模型的比較模型
- Hibernate與 MyBatis的比較(轉)MyBatis