Go語言介紹
Go語言解決現代程式設計難題
go語言出現的原因
- 程式語言的演化的速度追不上計算機演化的速度; 高效能伺服器有越來越多的核心, 我們依舊在使用為單核設計的技術在程式設計
- 程式設計技術的演化體現在一個程式或者一個專案是分散且多人合作開發的, Go語言更易分享程式碼和包
Go語言的特點
- Go的高效能體現在編譯時間非常快速, 更加智慧的編譯器只關注那些直接被引用的庫, 不需要像Java、C、C++一樣遍歷依賴中的所有庫
- Go自帶強大的標準庫
- Go的快速開發體現在語法簡介, 關鍵字數量少易於記憶
- Go內建併發機制, 不用被迫使用特定的執行緒庫, 就能讓軟體擴充套件使用更多資源
- Go不用為物件導向付出額外勞動, 使用介面作為程式碼複用的基礎模組
- Go自帶垃圾回收機制, 不需要使用者管理記憶體
併發 goroutine
- 併發是go語言最重要的特性
- goroutine是協程, 協程線上程中執行, 佔用的記憶體遠遠小於執行緒
- channel是一種內建的資料結構, 可以讓goroutine來通訊, 傳送和接收具有型別的資料
- Go語言是通過通訊來共享記憶體, 而不是通過共享記憶體來通訊
- goroutine
- goroutine是可以和其他goroutine一起並行執行的函式, 主程式main函式也是goroutine
- Go中會只用同一個執行緒執行多個goroutine
- goroutine使用的記憶體比執行緒更少(常常可以啟動成千上萬個), Go語言在執行時會自動在配置好的一組邏輯處理器上排程執行goroutine
- 每個邏輯處理器會繫結到作業系統的一個執行緒上
- channel
- 通道是一種內建的資料結構, 可以讓goroutine安全的通訊並且避免共享記憶體訪問的問題
- 併發中最難的部分就是要確保其他併發執行的執行緒、程式或者goroutine不會意外修改使用者的資料
- 不同執行緒在沒有同步保護的情況下修改同一個資料, 會發生災難; 在其他語言中, 如果使用全域性變數或者共享記憶體, 必須通過鎖規則來防止對同一個變數的不同修改
- 通道保證同一時間只會有一個goroutine修改資料
- 通道不提供跨goroutine的資料訪問保護機制, goroutine如果傳送的是副本, 每個goroutine對自己的副本修改是安全的; 如果傳輸的是指標資料, 讀和寫是由不同goroutine完成的, 每個goroutine需要額外的同步動作
Go語言的型別系統
- Go語言的資料型別是靈活且無繼承的
- Go語言使用組合(composition)開設計模式, 只需要將一個型別嵌入到另一個型別, 就能複用所有功能
- Go語言中一個型別由其他更微小的型別組合而成, 避免了傳統基於繼承模型
- Go語言的介面機制, 允許使用者對行為建模, 不需要宣告某個型別實現了摸個介面, 會自動判斷例項是否符合正在使用的介面
-
型別簡單
- 系統自帶豐富的型別
- 支援使用者自定義型別
-
介面對行為定義型別
- 介面用來描述型別的行為
- 一個型別的例項實現了一個介面的所有方法, 這個型別的例項就可以儲存在這個介面的型別中, 不需要額外宣告
記憶體管理
Go有用現代化的垃圾回收機制, Go中記憶體管理交給編譯器做, 雖然有額外開銷但是顯著降低了開發難度
小結
- Go語言是現代的, 快速的, 帶有一個強大的標準庫
- Go語言內建對併發的支援
- Go語言使用介面作為程式碼複用的基礎模組