何為runtime?
很多語言都有 Runtime

go的runtime特點
- 沒有虛擬機的概念
- Runtime 作為程序的一部分打包進二進制產(chǎn)物
- Runtime 隨用戶程序一起運行
- Runtime 與用戶程序沒有明顯界限,直接通過函數(shù)調(diào)用

- 內(nèi)存管理能力
- 垃圾回收能力(GC)
- 超強的并發(fā)能力(協(xié)程調(diào)度)

總結(jié):
- Go 的 Runtime 負責內(nèi)存管理、垃圾回收、協(xié)程調(diào)度
- Go 的 Runtime 被編譯為用戶程序的一部分,一起運行
go的編譯過程

詞法分析:

句法分析

語義分析

中間碼生成(SSA)



機器碼生成
- 先生成Plan9匯編代碼
- 最后編譯為機器碼


鏈接
- 將各個包進行鏈接,包括runtime
go程序是如何運行的,是main()方法嗎?
- runtime/rt0 XXX.s
讀取命令行參數(shù)
- 復制參數(shù)數(shù)量 argc 和參數(shù)值 argv 到棧上
初始化 go 執(zhí)行棧
- g0 是為了調(diào)度協(xié)程而產(chǎn)生的協(xié)程
- g0 是每個 Go 程序的第一個協(xié)程
調(diào)度器初始化 runtime.schedinit
- 全局棧空間內(nèi)存分配
- 堆內(nèi)存空間的初始化
- 初始化當前系統(tǒng)線程
- 算法初始化(map、hash)
- 加載命令行參數(shù)到 os.Args
- 加載操作系統(tǒng)環(huán)境變量
- 垃圾回收器的參數(shù)初始化
- 設置 process 數(shù)量
創(chuàng)建主協(xié)程
- 創(chuàng)建一個新的協(xié)程,執(zhí)行 runtime.main
- 放入調(diào)度器等待調(diào)度
初始化M
- 初始化一個 M,用來調(diào)度主協(xié)程
主協(xié)程執(zhí)行主函數(shù)
- 執(zhí)行 runtime 包中的 init 方法
- 啟動 GC 垃圾收集器
- 執(zhí)行用戶包依賴的 init 方法
- 執(zhí)行用戶主函數(shù) main.main()
總結(jié):
- Go 啟動時經(jīng)歷了檢查、各種初始化、初始化協(xié)程調(diào)度的過程
- main.main()也是在協(xié)程中運行的
調(diào)度器是什么?
為什么初始化M?
為什么不是直接執(zhí)行main.main(),而是將其放入調(diào)度器?
go語言是面向?qū)ο髥幔?/span>
Go允許OO的編程風格
- Go的Struct可以看作其他語言的Class
- Go缺乏其他語言的繼承結(jié)構
- Go的接口與其他語言有很大差異
go的“類”
- 其他語言中,往往用class表示一類數(shù)據(jù)class的每個實例稱作“對象
- Go中用struct表示一類數(shù)據(jù)
- struct每個實例并不是“對象”,而是此類型的"值"
- struct也可以定義方法
go的繼承
- Go并沒有繼承關系
- 所謂Go的繼承只是組合
- 組合中的匿名字段,通過語法糖達成了類似繼承的效果
go的接口
- 接口可以定義Go中的一組行為相似的struct
- struct并不顯式實現(xiàn)接口,而是隱式實現(xiàn)
Go沒有對象、沒有類、沒有繼承
- Go通過組合匿名字段來達到類似繼承的效果
- 通過以上手段去掉了面向?qū)ο笾袕碗s而幾余的部分
- 保留了基本的面向?qū)ο筇匦?/li>
企業(yè)級go項目包管理
go包管理困境
- 沒有統(tǒng)一的包管理方式
- 包之間的依賴關系很難維護
- 如果同時需要一個包的不同版本,非常麻煩
- 嘗試使用 godep、govendor、glide 等解決
- 未徹底解決 GOPATH 存在的問題
- 使用起來麻煩
go modules
- 本質(zhì)上,一個 Go 包就是一個項目的源碼
- gomod 的作用:將 Go 包和 Git 項目關聯(lián)起來
- Go 包的版本就是 git 項目的 Tag
gomod 就是解決“需要哪個 git 項目的什么版本'、
- 使用goproxy.cn作為代理
- go env -w GOPROXY=https://goproxy.cn,direct
想用本地文件替代怎么辦?
- go.mod 文件追加:replace github.com/effail/tunny => xxx/xxx
- go vender 緩存到本地
- go mod vendor //不是之前的 go vendor
本文來自博客園,作者:孫龍-程序員,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/sunlong88/p/18593481
浙公網(wǎng)安備 33010602011771號