以下是源文件的组织方式
✘-1 ~/Go/src/github.com/krmahadevan/packages
18:24 $ tree .
.
├── sample_main.go
└── sample_one.go
0 directories, 2 files
这是源代码的样子:
sample_one.go
package main
var data map[string]string
func init() {
data = make(map[string]string, 0)
}
sample_one.go
package main
import "fmt"
func main() {
data["foo"] = "bar"
fmt.Println(data)
}
现在,当我尝试运行 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
但是当我将代码构建成二进制文件然后执行它时,它运行良好。
✔ ~/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
我想了解为什么会这样?
环境:
18:31 $ go version
go version go1.11.4 darwin/amd64
我找到的最接近的帖子是:Golang : command-line-arguments undefined: variable
但是这篇文章讨论了main
中定义的范围变量。
但是我的问题陈述涉及在另一个go文件中定义并在main
方法中访问的变量。
答案 0 :(得分:1)
要了解原因,请阅读go
命令文档:
用法:
go run [build flags] [-exec xprog] package [arguments...]
Run编译并运行命名的主Go软件包。通常是包装 被指定为.go源文件的列表,但也可能是 导入路径,文件系统路径或与单个已知路径匹配的模式 包,如“运行”中所示。或“运行我的/ cmd”。
Compile packages and dependencies
用法:
go build [-o output] [-i] [build flags] [packages]
Build编译由导入路径命名的包,以及 它们的依赖性,但不会安装结果。
如果要构建的参数是.go文件列表,则build会处理它们 作为指定单个程序包的源文件列表。
有关指定软件包的更多信息,请参见“转到帮助软件包”。欲了解更多 关于软件包和二进制文件的安装位置,请运行“ go help gopath”。
go run
:通常,程序包被指定为.go源文件的列表。
以您的go run
为例,列出文件:
go run sample_main.go sample_one.go