我的项目结构是这样的.
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
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(构建所有文件)应该在大多数时间工作.
在golang.org网页上,您可以阅读以下build命令:
如果参数是.go文件的列表,则build会将它们视为指定单个包的源文件列表.
因此,go build main.go将main.go视为单个包.相反,你应该使用:
go build
Run Code Online (Sandbox Code Playgroud)
包括文件夹中的所有文件.
当 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)