我有2个文件
/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被标记为未定义?
答案 0 :(得分:14)
尝试
go run Test.go someFile.go
答案 1 :(得分:10)
我认为你误解了go工具是如何工作的。你可以“去 构建“在一个目录中,它将构建整个包(一个包是 定义为目录中的所有.go文件)。去安装,去吧 测试,等等。运行是唯一需要您指定的 特定文件...它真的只是意味着在非常小的时候使用 程序,通常只需要一个文件。
所以:
go build && ./program_name
答案 2 :(得分:3)
你的代码是正确的:
someFile.go
和Test.go
属于同一个套餐(main
)SomeVar
是在顶级声明的const
,因此它具有包块范围,即main
包块范围SomeVar
是可见的,可以在两个文件中访问(如果您需要在Go中查看范围界定,请参阅Language Specification - Declarations and Scope)。
为什么会出现undefined
错误?
您可能已启动go build Test.go
或go run Test.go
,如果从/Users/username/go/src/Test/src/main
启动,则会产生以下输出:
# command-line-arguments
./Test.go:6: undefined: SomeVar
您可以在此处找到原因:Command go
如果您使用go build
文件列表启动go 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时这是一个常见问题:)< / p>
答案 3 :(得分:0)
由于我在遇到类似问题时登陆此页面,因此我将在已经说明的内容中包括此答案。如果您使用Go Run,则可以使用:
go run .
或go run .*
这个问题也被回答
How to run all .go files within current directory through the command line (multi file package)