Go os args将“ .go”视为文件路径而不是字符串

问题描述

这是我基本上尝试从路径打印基准的代码。 这意味着,如果用户输入“ /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