以下是源文件的组织方式
?-1 ~/Go/src/github.com/krmahadevan/packages
18:24 $ tree .
.
??? sample_main.go
??? sample_one.go
0 directories, 2 files
Run Code Online (Sandbox Code Playgroud)
下面是源代码的样子:
sample_one.go
?-1 ~/Go/src/github.com/krmahadevan/packages
18:24 $ tree .
.
??? sample_main.go
??? sample_one.go
0 directories, 2 files
Run Code Online (Sandbox Code Playgroud)
sample_main.go
package main
var data map[string]string
func init() {
data = make(map[string]string, 0)
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试运行sample_main.go 时,出现错误,指出data
未定义。
18:24 $ go run sample_main.go
# command-line-arguments
./sample_main.go:6:2: undefined: data
./sample_main.go:7:14: undefined: data
?-2 ~/Go/src/github.com/krmahadevan/packages
Run Code Online (Sandbox Code Playgroud)
但是当我将代码构建成二进制文件然后执行它时,它运行良好。
? ~/Go/src/github.com/krmahadevan/packages
18:27 $ go build
? ~/Go/src/github.com/krmahadevan/packages
18:28 $ ./packages
map[foo:bar]
? ~/Go/src/github.com/krmahadevan/packages
Run Code Online (Sandbox Code Playgroud)
我想了解为什么会出现这种行为?
环境:
18:31 $ go version
go version go1.11.4 darwin/amd64
Run Code Online (Sandbox Code Playgroud)
我找到的最接近的是这篇文章:Golang : command-line-arguments undefined: variable
但是这篇文章讨论了在main
.
但是我的问题陈述涉及在另一个 go 文件中定义并在main
方法中访问的变量。
要了解原因,请阅读go
命令文档:
用法:
Run Code Online (Sandbox Code Playgroud)go run [build flags] [-exec xprog] package [arguments...]
Run 编译并运行命名的主 Go 包。通常,包被指定为 .go 源文件列表,但它也可以是导入路径、文件系统路径或匹配单个已知包的模式,如“go run”。或“去运行我的/ cmd”。
用法:
Run Code Online (Sandbox Code Playgroud)go build [-o output] [-i] [build flags] [packages]
Build 编译由导入路径命名的包及其依赖项,但不会安装结果。
如果 build 的参数是 .go 文件列表,则 build 将它们视为指定单个包的源文件列表。
有关指定包的更多信息,请参阅“go help packages”。有关安装包和二进制文件的位置的更多信息,请运行“go help gopath”。
go run
:通常包被指定为 .go 源文件列表。
对于您的go run
示例,列出文件:
go run sample_main.go sample_one.go
Run Code Online (Sandbox Code Playgroud)