command-line-arguments "Undefined:"

160 阅读1分钟

问题描述:

今天在编译一个简单的Go-demo时,

使用go run main.go命令,出现下列问题:

项目是简单的斐波那契,本来想试单元测试与benchmark,结果在运行时就出现了此问题:

根本原因:

因为是在使用go run 时报出的错误,那么就首先查go run源码来找原因,go run 的代码在

$GOROOT/src/cmd/go/internal/run/run.go

初始化函数的第一行开始运行run命令,

在run命令进行后,首先初始化模式,Build等;其次匹配以".go""_test.go"为后缀的文件;接下来将文件打包,进入函数GoFilesPackage()

GofilesPackage的注释中就有说明

GoFilesPackage creates a package for building a collection of Go files. (typically named on the command line).

这说明go run 命令只打包命令行的文件,那在运行go run main.go且main.go并没有导入fib.go时,go run找不到main.go中的Fib(),导致“命令行参数错误,未定义Fib“

解决方案:

(最佳):

main目录下及main包中最好只有main.go文件,其他文件均放在其他的包里,使用时在main文件中导入其他包

(非最佳但能解决问题,出问题时可以按一下角度排查):

  • 使用go run .命令, 可以运行文件夹内所有文件
  • go run main.go fib.go上一条的啰嗦版
  • go build--生成一个可执行二进制文件(如demo.exe)--demo.exe运行可执行文件
    • go run:先编译,但在此处只以命令行参数为准,可能导致引用了其他文件但找不到的情况
    • go build:自动查找引用文件并打包
  • 改goland的配置,出现这个问题本质上是运行go run命令少参数导致的,是因为goland的配置项为,改为package或dictionary就好了,