本文目錄一覽:
Golang 真的好用嗎?
好用,優點如下:
並發簡單、效率高
函數可以返回多個參數
垃圾回收(相比c/c++。不過java、c#都有這個優勢)
簡單易上手,語言特性少(也算缺點)
配套工具完善(pprof太好用了)
簡介
Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、並髮型,並具有垃圾回收功能的編程語言。
羅伯特·格瑞史莫(Robert Griesemer),羅勃·派克(Rob Pike)及肯·湯普遜(Ken Thompson)於2007年9月開始設計Go,稍後Ian Lance Taylor、Russ Cox加入項目。Go是基於Inferno操作系統所開發的。Go於2009年11月正式宣布推出,成為開放源代碼項目。
並在Linux及Mac OS X平台上進行了實現,後來追加了Windows系統下的實現。在2016年,Go被軟件評價公司TIOBE 選為「TIOBE 2016 年最佳語言」。 目前,Go每半年發佈一個二級版本(即從a.x升級到a.y)。
如何評價Golang的設計
像 C# 和 Java 也可以使用 unsafe 來訪問更底層,而高級封裝,Go 語言只是抽象了一些用 C 實現起來特別繁重,坑特別多的東西.就像 slice 簡化了對數組的操作和處理,而 channel 什麼的,讓實現並發邏輯簡潔又高效,讓程序員可以有更多精力聚焦業務邏輯的設計,而不是關心這個鎖,那個鎖.但要說到語言設計的優劣,Go語言確實沒太多亮點.特別是處理數據庫數據和 JSON類似的數據還是和其他強類型語言一樣,麻煩又繁瑣.
但在工程上,或者實際項目上,它有無可匹敵的幾大優勢:
1. 容易部署,比任何一種能勝任商業項目的語言都要簡單,幹練.
2. 由於語言設計的硬性規則,讓執行一套輔助開發的工具,更好實現.比如代碼格式化,代碼分析.(雖然有點沒人性,但很適合發揮團隊效益)
3. 也因為硬性規則,編譯時間特別快.
4. 也因為硬性規則,單元測試起來也很方便,基本可以實現邊寫邊測.這種特性有時候很有用.
5. 因為編譯時間快和部署的相對簡單,它也能像動態語言一樣,做一些類似腳本的工作.不需要像 Java 和 C# 一樣,做點小事情,也要一個碩大的運行庫,什麼都要正規正矩的設計幾個接口,不然重用起來很難.
再者很少有大項目,不需要或多或少的觸碰一下底層來突破性能瓶頸,或者加速項目開發的.
比如說在 Go 語言里, 可以用 unsafe.Pointer(不需在內存上拷貝數據) 在 []byte 和 string 之間進行轉換.
總而言之,Go 語言是一種進可攻退可守的語言.可以偏向效率的很快開發一個項目,可以為了性能,不斷的優化數據結構,不斷的開發硬件的性能.
推薦一個GO語言教程,最好能從最基礎的開始?
Go 語言被設計成一門應用於搭載 Web 服務器,存儲集群或類似用途的巨型中央服務器的系統編程語言。對於高性能分佈式系統領域而言,Go 語言無疑比大多數其它語言有着更高的開發效率。它提供了海量並行的支持,這對於遊戲服務端的開發而言是再好不過了。最近黑馬程序員剛出了一套go語言的教程,還不錯,可以去視頻庫里下載,或者管播妞要也行。
Go語言設計與實現(上)
基本設計思路:
類型轉換、類型斷言、動態派發。iface,eface。
反射對象具有的方法:
編譯優化:
內部實現:
實現 Context 接口有以下幾個類型(空實現就忽略了):
互斥鎖的控制邏輯:
設計思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結,讀寫鎖的設計還是非常巧妙的:
設計思路:
WaitGroup 有三個暴露的函數:
部件:
設計思路:
結構:
Once 只暴露了一個方法:
實現:
三個關鍵點:
細節:
讓多協程任務的開始執行時間可控(按順序或歸一)。(Context 是控制結束時間)
設計思路: 通過一個鎖和內置的 notifyList 隊列實現,Wait() 會生成票據,並將等待協程信息加入鏈表中,等待控制協程中發送信號通知一個(Signal())或所有(Boardcast())等待者(內部實現是通過票據通知的)來控制協程解除阻塞。
暴露四個函數:
實現細節:
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數簽名的協程,在同 Group 下協程並發執行過程並收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現時就終止組內各協程。
設計思路:
結構:
暴露的方法:
實現細節:
注意問題:
包: “golang.org/x/sync/semaphore”
作用:排隊藉資源(如錢,有借有還)的一種場景。此包相當於對底層信號量的一種暴露。
設計思路:有一定數量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數量 n。通過隊列排隊執行借貸。
結構:
暴露方法:
細節:
部件:
細節:
包: “golang.org/x/sync/singleflight”
作用:防擊穿。瞬時的相同請求只調用一次,response 被所有相同請求共享。
設計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進行一次訪問,組內每個協程會獲得對應結果的一個拷貝。
結構:
邏輯:
細節:
部件:
如有錯誤,請批評指正。
golang 2.0發佈時間
golang2.0發佈時間是2019年2月1日。目前在golang2.0的提案中,大約有120個未解決的問題被標記為golang2.0的提案,每一個問題都與重要的庫或語言更改相關,而這些問題通常不能滿足當前Go1的兼容性,開發人員將這些提案分類為Go2Cleanup、NeedsDecision等,以便後續的執行操作。
golang2.0設計
本概覽及附帶的細節草案是《golang2.0設計草案》golang2.0文檔的一部分,golang2.0的總體目標是為Go無法擴展到大型代碼庫和大量開發人員這一問題提供最重要的解決方式。
在Go開源之前,Go團隊成員尤其是IanLanceTaylor就一直在研討泛型的可能設計即參數多態,parametricpolymorphism。谷歌從C和Java的經驗中得知,這一話題非常豐富、複雜,要想考慮透徹並設計出一個良好的解決方案將花費很長時間。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/243489.html