go build失敗報方法undefined的解決過程
記一次在寫cli腳本的時候,碰到的一個問題。
問題
自己是寫服務端的,有時候會寫一些cli腳本去跑測試。習慣main.go寫主流程,其他子文件寫方法,這樣子代碼不會都在main.go裡面。但這麼寫直接GoLand點擊main旁邊的按鈕是可以執行,一旦用go build就報某個引用的方法,undefined。
范例代碼
//main.go package main import "fmt" func main() { fmt.Println("add result : ", Add(1, 2)) fmt.Println("multi result : ", Multi(1, 2)) }
//operation.go package main func Add(a, b int) int { return a + b } func Multi(a, b int) int { return a * b }
註意這是兩個文件,不是都在main.go裡面,package都是main。這兩個文件,都在同一個目錄下面。
操作
直接點擊run,結果是有的,也沒有報錯
go build就報錯,原本調用的方法undefined
但是上一步可以執行呀,也有結果
解決
原因是go語言中main包和其他package是不同的,它定義瞭一個獨立可執行程序,而不是一個庫。一般的包名是.go文件的目錄名,編譯器會將同一目錄下的不同.go文件視作同一個包。但是main包的目錄不是main目錄,所以問題就是在包的引用和定義上,如果想在main包中添加函數調用,2個方法:
- 寫在main函數所在的go文件中;
- 創建另一個package,main函數去調用這個包。【建議】
修改後代碼
// main.go package main import ( "fmt" "train/package/operation" ) func main() { fmt.Println("add result : ", operation.Add(1, 2)) fmt.Println("multi result : ", operation.Multi(1, 2)) }
operation.go放到一個單獨的包
// operation.go package operation func Add(a, b int) int { return a + b } func Multi(a, b int) int { return a * b }
此時再go build就可以解決瞭。
總結
到此這篇關於go build失敗報方法undefined的文章就介紹到這瞭,更多相關go build失敗報方法undefined內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!