Go常见问题:command-line-argument: ***: undefined: ***

我们通常在go代码时,通常采用idea或者命令行的形式进行编译和运行,这两天我遇到一个非常困惑的问题,一直没找到具体原因,已经做了快一年的go程序员,看见这个问题甚是脸疼。

问题描述:

在开发代码过程中,经常会因为逻辑处理而对代码进行分类,放进不同的文件里面;像这样,同一个包下的两个文件,点击idea的运行按钮或者运行 go run main.go命令时,会报出如下错误,详情见图:

# command-line-arguments

src/demo/main/main.go:4:2: undefined: demo

Compilation finished with exit code 2

demo 失败样例

但是输入 go build,之后当前目录下会生成一个二进制文件,执行后会发现输出正确结果:

demo 成功样例

问题分析:

通过操作发现,输入go run main.go会执行失败,输入go build,在运行二进制文件可以成功,然后开始分析go源代码,找到执行命令的入口。

cmd 路径和列表

在源代码的main函数中,我们发现从base.Commands的切片中获取要执行的命令,然后和传入的args一起执行cmd.Run(cmd, args)这个方法;

主函数入口
main 的 init 里的 base.Command 切片

然后再回过头看cmd.Run(cmd, args)这个函数,结果发现它只是定义了一种类型,具体实现这里没有指出;

Command 结构体

紧接着回头去看run包下的函数,会发现run.go在初始化的时候,会把改文件下的runRun()函数赋值给base.Command{}定义的对象CmdRun,结果会发现runRun函数的的参数类型和个数完全符合cmd.Run(cmd, args)这个函数类型,在go语言中,函数的参数类型和参数个数符合定义的函数类型,则说明改函数实现了定义函数(注:go语言中,函数与方法不同)。

run.go 文件详情

在runRun()函数中,会发现files和cmdArgs接收的是传过来的文件列表,然后会通过GoFilesPackage(files),然后会入栈、加载、出栈等操作,由于启动的时候传递的只是一个.go文件,并没有传递demo.go,所以系统在加载main.go文件中并没有找到demo.go文件中定义的变量,则在p := load.GoFilesPackage(files)这一行,开始出错。

正确操作:

该出错原因属于go的多文件加载问题,采用go run命令执行的时候,需要把待加载的.go文件都包含到参数里面,正确操作如下图所示:

正确操作示意图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,481评论 0 5
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 这是发生在我和老公登记领结婚证日子里的真实故事。本该是值得高兴、值得纪念的日子,但每每想起都会让我自责和难过,虽已...
    禾小禾hhmm026阅读 921评论 4 3
  • 转于://www.greatytc.com/p/ccb61e4d1793 如果在项目中加入多个第三方库后出...
    f48ac133a97f阅读 1,202评论 0 2