函数在同一个包中未定义

时间:2014-08-06 22:37:41

标签: go

我的项目结构是这样的。

packagetest/
    main.go
    lib.go

main.go中,我有这段代码。

package main

import "fmt"

func main() {
    fmt.Println("Hello from main.go.")
    Test()
}

lib.go中,我有这段代码。

package main

import "fmt"

func Test() {
    fmt.Println("This is the Test function in lib.go.")
}

当我尝试使用go build main.go进行编译时,我得到./main.go:7: undefined: Test。这种构造我的代码的方式是否可行?

9 个答案:

答案 0 :(得分:37)

尝试只运行go build。当你给它一个go文件作为参数时,它不会寻找其他go文件。您也可以go build *.go

答案 1 :(得分:10)

这是一篇很老的帖子,但它没有清楚地回答我的问题,所以我将来为了别人的利益而张贴。

运行go run --help时,您会找到本手册:

  

运行编译并运行包含命名Go源文件的主包。   Go源文件被定义为以文字结尾的文件" .go"后缀。

     

默认情况下,' go run'直接运行已编译的二进制文件:' a.out参数......'。

go run <filename.go>用于只有少量文件的小程序。对于多个文件,您将遇到main.go无法找到其他文件的问题,因为go run除非已命名,否则不会隐式编译和链接它们。这就是项目工作go build的原因。

或者,go run *.go(构建所有文件)应该在大多数时间都有效。

答案 2 :(得分:5)

golang.org网页上,您可以阅读有关build命令的信息:

  

如果参数是.go文件的列表,则build会将它们视为指定单个包的源文件列表。

因此,go build main.go会将main.go视为单个包。相反,你应该使用:

go build

包含文件夹中的所有文件。

答案 3 :(得分:2)

当go找不到其他文件时(例如本示例中的lib.go),就会发生此问题。

如果使用JetBrains Goland,则应将“运行种类”更改为“目录” 。 Goland将帮助您做到这些:

  • go build .
  • 运行该执行文件。

如果使用JetBrains Goland,则可以对比“运行种类”之间的区别。enter image description here

当我选择“文件”,然后运行时,您将在控制台上看到如下消息:

GOROOT=C:\Go #gosetup
GOPATH=C:\Users\hgs\go #gosetup
C:\Go\bin\go.exe build -o C:\Users\hgs\AppData\Local\Temp\___go_build_select_go__4_.exe "C:/Users/hgs/Google Drive/My Maps/computer/2.programming_lang/Golang/source-code-refer/basic/select.go" #gosetup
# command-line-arguments
.\select.go:14:16: undefined: Add

当您选择“目录”并选择目录,然后运行时,您将看到以下内容:

GOROOT=C:\Go #gosetup
GOPATH=C:\Users\hgs\go #gosetup
C:\Go\bin\go.exe build -o C:\Users\hgs\AppData\Local\Temp\___go_build_basic_.exe . #gosetup
C:\Users\hgs\AppData\Local\Temp\___go_build_basic_.exe #gosetup
...

答案 4 :(得分:1)

我认为问题是你只能使用包main一个文件。

尝试将lib.go放在不同的包中。这需要:

  1. lib.go存在于与新包名称相同的文件夹中(例如,myLibs)。

  2. 将包名添加到lib.go(包myLibs)。

  3. 然后,在主要:

    import myLibs
    call myLibs.Test()
    

答案 5 :(得分:1)

如果要对Go main pkg使用多个文件,而不是对go main.go使用单个文件路径,请在run或build命令中使用go要求main pkg目录,例如:

#from outside packagetest dir
go run ./packagetest/
go build ./packagetest/

#from within packagetest:
go run ./
go build ./

答案 6 :(得分:0)

  • lib.go应该重命名为main_test.go
  • 测试功能的功能签名应为func Test(t *testing.T) {
  • 软件包testing应该导入main_test.go中。
  • 理想情况下,Test函数应具有反映其测试内容的名称,例如TestPrinting

然后go buildgo test都应该起作用。

答案 7 :(得分:0)

如果您不想build,只需执行以下命令,也可以尝试以下命令:

go run main.go lib.go

答案 8 :(得分:0)

运行所有文件然后可以调用

go run *.go

go run main.go lib.go