Golang未定义的变量

Dav*_*ave 11 undefined go

我有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被标记为未定义?

小智 14

尝试

go run Test.go someFile.go
Run Code Online (Sandbox Code Playgroud)


war*_*iuc 10

Quote:

我认为你误解了go工具是如何工作的.你可以在一个目录中"go build",它将构建整个包(一个包定义为目录中的所有.go文件).同样适用于go install,go test等.Go run是唯一一个需要你指定特定文件的...它实际上只适用于非常小的程序,通常只需要一个文件.

所以:

go build && ./program_name
Run Code Online (Sandbox Code Playgroud)

也可以看看


Par*_*ara 5

你的代码是正确的:

  • someFile.go并且Test.go属于同一个包 ( main)
  • SomeVarconst在顶层声明的,所以它有一个包块作用域,即main包块作用域
  • 因此,SomeVar是可见的并且可以在两个文件中访问

(如果您需要查看 Go 中的范围,请参阅语言规范 - 声明和范围)。

为什么你会得到一个undefined错误?

您可能启动了go build Test.gogo 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 buildgo 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 时的常见问题:)