Go程序处理.go后缀路径参数时出现文件不存在错误求助
问题分析与解决
核心问题:go run的参数解析逻辑
你遇到的报错根本不是Go代码本身的问题,而是**go run命令的参数处理规则**导致的:
go run会把所有跟在后面的.go后缀文件当成要编译的源文件,而非你的程序的命令行参数。- 当你输入
go run main.go "/some/path.go"时,go run会尝试去查找/some/path.go这个源文件(因为它是.go后缀),但这个文件不存在,所以抛出了stat错误。 - 而
.java后缀的文件不是Go源文件,所以go run会正确把它传递给你的程序作为参数。
解决方法
有两种简单的方式可以绕过这个问题:
方法1:先编译再运行
先把你的代码编译成二进制文件,再直接运行二进制并传递参数:
# 编译生成可执行文件(默认和源文件同名,这里是main) go build main.go # 运行二进制并传递参数 ./main "/some/path.go"
这种方式下,所有传递的参数都会被正确交给你的程序,不会被go run误解析。
方法2:用--分隔编译参数和程序参数
go run支持用--来明确分隔要编译的源文件和程序的命令行参数,--之后的所有内容都会被当成程序的参数,不管后缀是什么:
go run main.go -- "/some/path.go"
额外的代码优化建议
顺便提一下你的basename函数里的小问题:第二个for循环没有添加break,如果遇到像a.b.c这样的文件名,最终会返回a而不是a.b(即会去掉所有.之后的内容,而不是最后一个)。你可以修改第二个循环,找到第一个(从后往前).后就停止:
func basename(s string) string { // 丢弃最后一个"/"及其之前的所有内容 for i := len(s) - 1; i >= 0; i-- { if s[i] == '/' { s = s[i+1:] break } } // 丢弃最后一个"."及其之后的所有内容 for x := len(s) - 1; x >= 0; x-- { if s[x] == '.' { s = s[:x] break // 添加这行,找到最后一个.就停止 } } return s }
内容的提问来源于stack exchange,提问作者Nish
相关产品推荐
相关产品推荐

