命令行参数:处理“未定义”错误消息

Kri*_*van 5 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_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方法中访问的变量。

pet*_*rSO 6

要了解原因,请阅读go命令文档:

命令去

编译并运行 Go 程序

用法:

go run [build flags] [-exec xprog] package [arguments...]
Run Code Online (Sandbox Code Playgroud)

Run 编译并运行命名的主 Go 包。通常,包被指定为 .go 源文件列表,但它也可以是导入路径、文件系统路径或匹配单个已知包的模式,如“go run”。或“去运行我的/ cmd”。

编译包和依赖

用法:

go build [-o output] [-i] [build flags] [packages]
Run Code Online (Sandbox Code Playgroud)

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)

  • 感谢您帮助解决这个问题。那解决了问题。只是为了添加更多上下文,以防有人在从 GoLang IDE 等 IDE 中运行时遇到此问题,需要编辑配置并选择“运行种类”作为“包”。 (2认同)