GO OS考虑“。”围棋;作为文件路径而不是字符串

GO OS考虑“。”围棋;作为文件路径而不是字符串,go,Go,下面是我试图从路径打印base的代码。 也就是说,如果用户输入“/some/random/path.java”,则输出将是“path”。同样,如果用户arg为“/other/myapp.c”,则输出为“myapp” 这适用于除输入后缀为“.go”之外的所有情况。我猜这是行不通的,因为Go(或visualstudio)实际上正在寻找一个具有Go扩展名的文件 代码 我是如何执行它的: go run main.go "/some/path.java" - this works an

下面是我试图从路径打印base的代码。 也就是说,如果用户输入“/some/random/path.java”,则输出将是“path”。同样,如果用户arg为“/other/myapp.c”,则输出为“myapp”

这适用于除输入后缀为“.go”之外的所有情况。我猜这是行不通的,因为Go(或visualstudio)实际上正在寻找一个具有Go扩展名的文件

代码

我是如何执行它的:

go run main.go "/some/path.java" - this works and the output is "path"
go run main.go "/some/path.go" - this doesn't work and I get an error that says "stat /some/path.go: no such file or directory".

这是一个Linux错误。

这是使用
go run
运行应用程序的结果。您可以列出多个要运行的源文件(不仅仅是一个源文件),所有源文件都将被视为
main
包的文件

由于
/some/path.go
“符合”成为
.go
源文件的条件,因此它不会传递到您的应用程序,而是由
go
工具使用

首先构建应用程序,然后运行可执行二进制文件,这样
go-run
就不会产生干扰

还要注意的是,第一个参数不是
.go
文件名,它会破坏源文件列表,并且它和所有后续参数都会传递给您的应用程序,即使它们是有效的
.go
文件名

例如,这将通过
/some/path.go

go run main.go apple.txt /some/path.go 
并将输出:

apple
path

这回答了你的问题吗?这里有一个关于标准术语的词:“basename”是一个文件名。“dirname”是路径,而不是文件。两者都不是指没有“扩展名”的文件名。请注意,unix中的文件扩展名实际上只是文件名的一部分,恰好遵循
和标准。因此,将“路径”称为“path.go”的“base”是一个非常糟糕的术语选择imho@DanielFarrell理解并同意。感谢您指出这一点。此外,除非您是为了练习而这样做,否则请看一下。我本来打算建议
--
,但从我所知,它实际上并没有被
解读为分隔符,而是被
转运行
。它只是作为参数传递给main.go。基本上,除了
.go
文件以外的任何文件都是作为参数传递的-包括
--
,但也包括
-b
-j
,甚至只是
带引号的空字符串,以防止shell将其解释出来谢谢你@icza并感谢所有其他人。这里的问题是他建议的,程序需要先编译。
apple
path