Go 套件通常由多個模組或程式使用。儘管只需要一小部分功能,但整個套件最終可以被編譯到每個可執行檔中。這可能會導致產生包含未使用的函數和字串的大型二進位。
不幸的是,與其他一些程式語言不同,Go 目前不提供在編譯時明確刪除未使用程式碼的方法。編譯器在某種程度上優化並刪除了無法存取的程式碼,但它無法確定可能可達的未使用程式碼,即使它從未明確調用。
可以使用以下程式碼來示範此行為:
// play/subplay.go package subplay func A() { fmt.Printf("this is function A()") } func B() { fmt.Printf("secret string") }
在主模組中,我們匯入了subplay 套件,但只呼叫了函數A():
// main.go package main import "play/subplay" func main() { subplay.A() }
儘管如此B() 從未被調用,字串「秘密字串」仍然包含在生成的二進位中。
如同對此問題的答覆所述,一種解決方法是注意導入包引入的依賴項。例如,匯入 net/http 也會匯入 39 個其他套件,這會顯著增加二進位大小,即使沒有使用這些套件。
雖然編譯器可能無法刪除未使用的程式碼,但它優化程式碼以提高效率仍然至關重要。避免不必要的函數呼叫、保持資料結構精簡以及最小化字串分配都有助於減少二進位大小。
以上是如何在編譯時刪除 Go 中未使用的程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!