问题描述
这是我基本上尝试从路径打印基准的代码。 这意味着,如果用户输入“ /some/random/path.java”,则输出将为“ path”。同样,如果用户arg为“ /another/myapp.c”,则输出将为“ myapp”。
这适用于所有内容,但输入的后缀为“ .go”时除外。我正在猜测,因为Go(或Visual Studio)实际上正在寻找带有Go扩展名的文件?
package main
import (
"fmt"
"os"
)
func main() {
inputs := os.Args[1:]
for _,arg := range inputs {
fmt.Println(basename(arg))
}
}
func basename(s string) string {
// discard last "/" and everything before
for i := len(s) - 1; i >= 0; i-- {
if s[i] == '/' {
s = s[i+1:]
break
}
}
// discard everything after "."
for x := len(s) - 1; x >= 0; x-- {
if s[x] == '.' {
s = s[:x]
}
}
return s
}
我如何执行它:
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
运行应用程序的结果。您可以将多个源文件列出到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