Go語言的語言特性
1.2.1 併發編程
Go 語言引入了goroutine
,它是 Go 實現快速高效的併發編程的關鍵。通過調用 go 關鍵字,我們就可以讓函數以 goroutine 的方式進行運行,也就是以協程爲單位進行運行。協程比線程更加的輕量級,也更節省系統資源,這使得我們可以創建大量的 goroutine,從而進行輕鬆且高質量的併發編程。同時,goroutine 內部採用管道channel
進行消息傳遞,從而實現共享內存。
1.2.2 錯誤處理
Go 語言中的錯誤處理的哲學和 C 語言一樣,函數通過返回錯誤類型(error
)或者bool
類型(不需要區分多種錯誤狀態時)表明函數的執行結果,調用檢查返回的錯誤類型值是否是nil
來判斷調用結果。並引入了 defer 關鍵字用於標準的錯誤處理流程,並提供了內置函數panic
、recover
完成異常的拋出與捕捉。
f := func(x,y int) int {
return x+y
}
第一個hello world程序
package main
import (
"fmt" //導入fmt包,調用其中的Println()函數
)
func main() {
fmt.Println("Hello,world!")
}
運行的時候
go run hello.go
1.2.3 內存回收GC
內存自動回收不需要開發人員擔心,自動回收垃圾
GC過程:
- 首先stop the world
- 掃描所有對象進行判活
- 把可回收對象在一段bitmap裏面標記下來
- 接着立即start the world恢復服務
- 同時起一個線程goroutine
- 將回收內存放到空閒的list中進行備用
- 不進行物理釋放,物理釋放由專門的線程來執行
GC的瓶頸:
在於每次都要收集所有的對象進行判活,收集的對象越多,速度越慢,隨着版本會不斷優化
內存分配:
- 首先分配一個大內存區域
- 大內存會被企鵝分爲各個大小等級的塊,放入不同的空閒list中
- 對象分配空間是從空閒的list中取出大小合適的內存塊
- 內存回收時,會把不用的內存從放回空閒的list
- 空閒內存會按照一定的策略合併,以減少碎片
1.2.4 編譯
目前的golang的編譯器是有兩種,一種是基於gcc的Gccgo,還有一種是針對於64位x64和32位x86計算機的一套編譯器
庫的引入
go的很多第三方庫都在github上面,所以只需要引入github上的路徑就可以,庫就會下載到工程的pkg目錄下面,說明需要go編程的時候需要聯網,但是也是很方便的。
1.2.5 網絡編程接口
go語言的網絡編程接口十分的豐富
- socket: net,Dial(基於tcp/udp ,封裝了傳統的connect 、listen、accept等接口)
- http: 使用http.Get / Post
- rpc使用client.Call
函數多返回值
支持多個返回值,可以簡化編程
語言交互性
Go語言可以和c程序的交互,開發者完全可以忽略c語言和go之間的差異
異常處理
go不支持try catch 因爲可能會被濫用,導致代碼量的增加
go裏面的異常處理是如果是普通異常,查看返回的error對象
如果是比較嚴重的異常,比如除零等,重點性panic。使用defer panic recover
來修復異常
其他的有趣類型特性
1.go語言是強類型的,但是支持類型的自動推導
2.go是有interface的機制,只需要實現這個接口裏面的函數就可以,不需要顯示的寫出繼承關係。go推薦interface只提供一到兩個方法
3.defer機制
可以使用改關鍵字制定需要延遲執行的邏輯體,也就是說在函數體return前或者出現panic之前使用。對defer引用可以簡化編程,提高可讀性。
4.包的機制 main只有一個
5.交叉編譯 源碼都是utf-8的格式編碼 國際化!!