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

时间:2019-01-27 13:03:29

标签: go

以下是源文件的组织方式

✘-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方法中访问的变量。

1 个答案:

答案 0 :(得分:1)

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

  

Command go

     

Compile and run Go program

     

用法:

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