Golang未定义变量

15

我有2个Go语言文件:

/Users/username/go/src/Test/src/main/Test.go

package main

import "fmt"

func main() {
    fmt.Printf(SomeVar)
}

并且文件 /Users/username/go/src/Test/src/main/someFile.go

package main

const SomeVar = "someFile"

然而我一直在遇到编译错误:

/Users/username/go/src/Test/src/main/Test.go:6: undefined: SomeVar

有人能解释一下为什么SomeVar被标记为未定义吗?


2
你是如何调用编译器的?如果你运行了 go build Test.go,那么它只会将这个文件视为包的一部分。 - James Henstridge
  1. 使用 go build - go run 仅适用于简单的单文件程序。
  2. 不要将文件夹命名为 'main'。
- elithrar
请展示你的 $GOPATH - 0xAX
4个回答

16

尝试

go run Test.go someFile.go

11

引用:

我认为你误解了go工具的工作方式。你可以在一个目录中执行"go build"命令,它将构建整个包(一个包被定义为目录中的所有.go文件)。go install、go test等都是一样的。只有go run需要指定特定的文件……它真的只适用于非常小的程序,通常只需要一个单独的文件。

所以要这样做:

go build && ./program_name

另请参阅


@staticx:它提供了错误的解释和解决方案。它回答了这个问题。 - peterSO
1
现在它可以了。您的帖子出现在低质量队列中。 - Engineer2021
这对我很有帮助!我在尝试在Gogland中运行我的大型程序时遇到了这个问题。我通过进入运行配置并将项目类型切换为目录来解决了它! - Shadoninja

9
你的代码是正确的:
  • someFile.goTest.go 属于同一个包(main
  • SomeVar 是一个顶层声明的 const,因此它具有包块作用域,即 main 包块作用域
  • 因此,在这两个文件中都可以看到和访问 SomeVar

那么为什么会出现“未定义”的错误呢?

可能是因为你执行了 go build Test.go 或者 go run Test.go 命令,如果从 /Users/username/go/src/Test/src/main 目录下执行,则会产生以下输出:

(如果需要复习 Go 中的作用域,请参阅语言规范 - 声明和作用域。)
# command-line-arguments
./Test.go:6: undefined: SomeVar

您可以在此处找到原因:Command go 如果您使用go buildgo run命令并指定了一组.go文件,它会将它们视为指定单个包的源文件列表,即认为没有其他代码片段位于main包中,因此会出现错误。 解决方法是包含所有所需的.go文件:
go build Test.go someFile.go

go run Test.go someFile.go

go build 命令也可以不带参数使用,会构建包中找到的所有文件:

go build

注意1:上述命令是针对本地包的,因此必须从/Users/username/go/src/Test/src/main目录中启动

注意2:尽管其他答案已经提供了有效的解决方案,但我决定在这里添加一些更多的细节来帮助社区,因为这是当你开始使用Go时的常见问题 :)


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接