我有2个文件
/Users/username/go/src/Test/src/main/Test.go
package main
import "fmt"
func main() {
fmt.Printf(SomeVar)
}
Run Code Online (Sandbox Code Playgroud)
和文件/Users/username/go/src/Test/src/main/someFile.go
package main
const SomeVar = "someFile"
Run Code Online (Sandbox Code Playgroud)
但是我经常遇到编译器错误
package main
import "fmt"
func main() {
fmt.Printf(SomeVar)
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么SomeVar被标记为未定义?
war*_*iuc 10
我认为你误解了go工具是如何工作的.你可以在一个目录中"go build",它将构建整个包(一个包定义为目录中的所有.go文件).同样适用于go install,go test等.Go run是唯一一个需要你指定特定文件的...它实际上只适用于非常小的程序,通常只需要一个文件.
所以:
go build && ./program_name
Run Code Online (Sandbox Code Playgroud)
你的代码是正确的:
someFile.go并且Test.go属于同一个包 ( main)SomeVar是const在顶层声明的,所以它有一个包块作用域,即main包块作用域SomeVar是可见的并且可以在两个文件中访问(如果您需要查看 Go 中的范围,请参阅语言规范 - 声明和范围)。
为什么你会得到一个undefined错误?
您可能启动了go build Test.go或go run Test.go,如果从启动,两者都会产生以下输出/Users/username/go/src/Test/src/main:
# command-line-arguments
./Test.go:6: undefined: SomeVar
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到原因:Command go
如果您启动go build或go run使用.go文件列表,它会将它们视为指定单个包的源文件列表,即,它认为包中没有其他代码段main,因此出现错误。解决方案包括所有必需的.go文件:
go build Test.go someFile.go
go run Test.go someFile.go
Run Code Online (Sandbox Code Playgroud)
go build 也将在没有参数的情况下工作,从而构建它在包中找到的所有文件:
go build
Run Code Online (Sandbox Code Playgroud)
注 1:以上命令指的是本地包,因此必须从/Users/username/go/src/Test/src/main目录启动
注 2:虽然其他答案已经提出了有效的解决方案,但我决定在此处添加更多细节以帮助社区,因为这是您开始使用 Go 时的常见问题:)