问题描述:
今天在编译一个简单的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就好了,