go學習記錄–如何執行
個人一直覺得語法的學習不存在多大問題,我們們真正要了解的是程式如何執行。對於go語言的編譯到執行其實還是一個比較有意思的過程,比如go的程式碼寫完到底層的彙編程式碼是一個怎樣的結構,通過了解底層的結構,我們應該如何去深入的學習go。
導讀
- go程式編譯執行
- 再看彙編碼
- 思考總結
go程式編譯執行
我們們先簡單執行一個go的程式碼例子,看下要滿足什麼條件go才能編譯執行
程式碼示例
go的文件肯定會告訴你,打包執行一個程式需要在main包下有一個main方法才行。
寫了下面一段簡單程式碼,我們們看下具體的操作流程
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
上面程式碼寫完之後我們們先執行一下,通過go run執行結果如下
我們們再把程式碼改一下package的main隨便改一個名字試一下
果然就提示沒有main的package不能執行
綜上go的編譯是先定位到main package,然後找到main函式為入口開始
再看彙編碼
我們們先把程式碼build一下,具體生成如下檔案
我們們再把生成的檔案放到IDA裡面反向檢視一下,執行程式反向之後可以看到N多個函式。
可以注意到裡面的函式的名字都是根據go裡面的包名加函式名構成,比如_runtime_f32hash
就是在go的runtime包下的f32hash函式,這也再一次說明go沒有像java一樣的class這麼一個玩意,而是由包和函式共同組成。
再通過過濾器查詢一下main方法,果然找到了一個_main_main的函式,如下圖所示
我們們具體看一下main的彙編指令,其實就是輸出一個helloworld
思考總結
總體來說通過上面的陳述,現在可以完全驗證開頭的問題了。
- go的垃圾回收等操作是在runtime包裡面執行
- go是根據包和原始碼檔案裡面的函式編譯,和原始檔關係不大
- go的編譯執行必須存在main的package以及main的函式
最後各位可以掃下方二維碼關注我公眾號,基本每週會推送一到兩篇的go學習記錄,後續學完基礎語法,會準備寫一個go微服務專案,原始碼依然放在github上面。
本作品採用《CC 協議》,轉載必須註明作者和本文連結