go 學習記錄--如何執行

Al1en發表於2020-03-22

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上面。

avatar

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章