函数在同一个包中未定义

425*_*esp 29 go

我的项目结构是这样的.

packagetest/
    main.go
    lib.go
Run Code Online (Sandbox Code Playgroud)

main.go,我有这个代码.

package main

import "fmt"

func main() {
    fmt.Println("Hello from main.go.")
    Test()
}
Run Code Online (Sandbox Code Playgroud)

lib.go,我有这个代码.

package main

import "fmt"

func Test() {
    fmt.Println("This is the Test function in lib.go.")
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时go build main.go,我明白了./main.go:7: undefined: Test.这种构造我的代码的方式是否可行?

Ste*_*erg 42

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

  • 对于那些可能和我有同样问题的人:请注意,“main_test.go”中的定义对“main.go”不可见。(但是你为什么要尝试正确访问它们呢?) (2认同)

Pie*_*Pah 11

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

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

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

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

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

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

  • 当我运行:`go run *.go` 时,它说:`CreateFile *.go: The filename, directory name, or volume label syntax is wrong.` (go version go1.10 windows/amd64, Windows 10 x64) (2认同)

Sha*_*vek 8

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

go run main.go lib.go
Run Code Online (Sandbox Code Playgroud)


ANi*_*sus 6

golang.org网页上,您可以阅读以下build命令:

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

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

go build
Run Code Online (Sandbox Code Playgroud)

包括文件夹中的所有文件.


kya*_*kya 5

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

如果您使用 JetBrains Goland,您应该将您的“运行种类”更改为“目录”。Goland 将帮助您完成这些:

  • go build .
  • 运行这个执行文件。

如果使用 JetBrains Goland ,可以对比一下“Run kind”的区别。在此处输入图片说明

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
...
Run Code Online (Sandbox Code Playgroud)