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!

推薦閱讀: