網頁

2022/5/18

Golang 執行時出現函式undefined錯誤

在命令列輸入go run main.go運行程式時,出現undefined: <Func>錯誤,<Func>main.go中調用在另一go檔的函式名稱。


原因是go run main.go只會編譯當下目錄中的main.go,但同目錄中其他的go檔(調用函式所在的go檔)未一起被編譯所以出現undefined錯誤。


例如專案目錄結構如下,根目錄有main.goutil.go

/
├── go.mod
├── main.go
└── util.go

main.go

package main

import "fmt"

func main() {
    r := Plus(1, 2)
    fmt.Println(r)
}

util.go

package main

func Plus(x int, y int) int {
    return x + y
}

在專案根目錄輸入go run main.go出現undefined錯誤:

$ go run main.go
# command-line-arguments
./main.go:6:7: undefined: Plus

這是因為go run後接file arguments檔案名稱則只會對指定的檔案進行編譯。相當於go build main.go只編譯main.go而出現同樣的undefined錯誤。

$ go build main.go
# command-line-arguments
./main.go:9:7: undefined: Plus

改成輸入go run .編譯目錄下的所有go檔並執行。

$ go run .
3

或輸入go run main.go util.go指定編譯main.goutil.go並執行。

$ go run main.go util.go
3

若是將util.go放到別的package例如util並修改package名稱並引入到main.go,則輸入go run main.go可正常運行。因為Go對引入的外部依賴會自動編譯。

/
├── util/
│   └── util.go
├── go.mod
├── main.go
└── util.go

main.go

package main

import (
    "fmt"

    "abc.com/demo/util"
)

func main() {
    r := util.Plus(1, 2)
    fmt.Println(r)
}

util.go

package util

func Plus(x int, y int) int {
    return x + y
}

go run main.go執行結果。

$ go run main.go
3


沒有留言:

張貼留言