聞道Go語言,6月齡必知必會

大家好 , 我是馬甲哥,
學習新知識,我的策略是模仿-->歸納--->舉一反三,
在同程倒騰Go語言一年有余,本次記錄《聞道Go語言 , 6月齡必知必會》,形式是同我的主力語言C#做姿勢對比 。

聞道Go語言,6月齡必知必會

文章插圖
1. 宏觀預覽1.1 常見結構對比
某些不一定完全對標,實現方式,側重點略點差異 。
go語言---C#語言---moduleassemblypkggo get github.com/thoas/go-funkpackageInstall-Package Masuit.Tools.Corestructclasspointerreferencenet/httpweb腳手架、 httpclientASP.NETCore、httpclientnet/http/DefaultServeMuxASP.NETCore腳手架路由goroutine異步任務、 async/awaitchannelCSPTPL data flowCSP模型在C#并非主流contexttimeout、cancellation-token1.2 訪問級別go語言使用[首字母大小]寫來體現公開/私有 ,  應用到package struct function;C#顯式使用關鍵字來體現 。
1.3 類型初始化go語言有兩初始化的內置關鍵字
  • new: 用于分配內存(帶內存零值),返回指針new(int), new(Cat)
  • make : 只用于slice、map、 channel 引用類型的初始化
C#基礎類型使用字面量,引用類型使用new關鍵字
2. 編碼邏輯結構2.1 順序這沒什么好說的,都是至上而下 ,  遇到函數進函數堆棧 。go語言每行代碼后不需要加分號;C#語言每行代碼后需要加分號 。go對于括號的使用有要求: 斜對稱,C#無要求 。
2.2 分支if --- elseif ---elsego和C#語言基本是一樣的
聞道Go語言,6月齡必知必會

文章插圖
- go語言else if、 else 不允許換行,C#對此無要求 。- C#要求[使用括號包圍]條件判斷語句 。switch -- case[break]
聞道Go語言,6月齡必知必會

文章插圖
- go語言case語句默認都加上了break,加不加都一樣 , 滿足當前case,執行完就會跳出當前switch,不會一直case下去;- C#語言執行分支需要主動break,若沒有break,表示共用可用的執行體 。2.3 循環
聞道Go語言,6月齡必知必會

文章插圖
  • go語言只有for循環 , C#還有while, do while
使用for來體現while/do while
聞道Go語言,6月齡必知必會

文章插圖

聞道Go語言,6月齡必知必會

文章插圖
3. 面向對象封裝抽象 繼承 多態
同樣是面向對象編程語言,go用結構體來體現,C#常用類來體現 。
聞道Go語言,6月齡必知必會

文章插圖
封裝通常go語言基于結構體、接收者函數來[封裝/提煉]事物和行為 。
  • 接收者函數分為: 值接收者函數、指針接收者函數 。
  • 兩種都能體現封裝,但[指針接收者函數]內的操作會體現到入參 。
  • 不管是值,還是指針,都能調用指針接收者函數/值對象接受者函數,效果還是如上一點一致 。
C# 顯式使用Class struct等結構來封裝數據和行為 。
抽象 + 繼承go語言沒有抽象函數、抽象類的說法,有接口抽象 和父子類繼承關系 。
接口將具有共性的方法放在一起,其他任何類型只要實現了這些方法就是實現了接口 , 俗稱鴨子模式 。
C#具備語義化的繼承/抽象/多態, 顯式繼承 。
聞道Go語言,6月齡必知必會

文章插圖
4. 指針 vs 引用指針指向一個內存地址; 引用指向內存中某個對象 。
一般認為go是C語言的家族 , 但是go的指針弱化了C語言的指針操作,go指針的作用僅操作其指向的對象,不能基于地址這個概念做指針移位 ,  也不能基于地址這個概念做類型轉化 。
A value of a pointer type whose base type is T can only store the addresses of values of type T.
go的指針簡化了指針的使用,減少了指針出錯的概率 。
引用可看做是指針的抽象,也基于code safe的理由,不能在引用上做算術運算和低級別的取巧 。
從這個意義上看,C#的引用等價于go的指針, 都是類型安全的指針 。
另一方面, 兩種語言都提供了對內存進行任意讀寫的姿勢(非代碼安全) 。
go的unsafe.Pointer本質是一個int指針 。
type Pointer *ArbitraryTypetype ArbitraryType int
C# unsafe關鍵字可用在函數、屬性、構造函數、代碼塊 。

推薦閱讀