首頁>Club>
比如time.Sleep函式
3
回覆列表
  • 1 # Go語言中文網

    看到這個問題,我都有點懷疑是不是我星球的球友提的~可見新手在學習原始碼時還是會有困惑的。下面球友的一些回覆:

    一般來說,Go 中函式不能只是宣告,沒有函式體。但標準庫中確實出現了只有函式宣告,沒見著函式體的程式碼。這是怎麼回事呢?

    在我的《專案實戰》的每日一學中,我針對該問題專門進行了總結。

    首先,函式肯定得有實現,沒有函式體,一定是在其他某個地方。Go 中一般有兩種形式。

    函式簽名使用 Go,然後透過該包中的彙編檔案來實現它

    比如,在標準庫 包中的函式基本只有函式簽名。比如:

    它的函式實現在哪呢?其實只要稍微留意一下發現該目錄下有一個檔案:asm.s,它提供了具體的實現,即透過彙編來實現:

    具體的實現,在 資料夾中,有興趣你可以開啟 asm_amd64.s 看看。

    很明顯,這種方式一方面會是效率的考慮,另一方面,有一些程式碼只能彙編實現。

    透過 指令來實現

    比如,在標準庫 包中的 函式:

    它的實現在哪裡呢?在 time 包中並沒有找到相應的彙編檔案。

    按照 Go 原始碼的風格,這時候一般需要去 包中找。我們會找到 time.go,其中有一個函式:

    這就是我們要找的 的實現。

    如果你有認真跟著學習「每日一學」,對於 應該不陌生,這裡的關鍵就在於這個指令,它的格式是:

    因此我們在遇到函式沒有實現,但彙編又不存在時,可以透過嘗試搜尋: 的形式來找,比如 就可以透過 來查詢具體實現在哪。

    這裡面要提示一點,使用 ,必須匯入 包,所以,有時候會見到: 這樣的程式碼。

    另外,想想為什麼 的實現要這麼搞?

    總結

    學會以上的技巧,對於你看標準庫的程式碼會有好處哦~

  • 中秋節和大豐收的關聯?
  • 不啟動車的情況下發動機排氣系統故障燈怎麼會亮?