Golang命令参数为空导致错误

zac*_*yer 4 go command-line-arguments

我正在写一个go程序,我需要使用命令参数.但是,如果我在运行可执行文件或go run gosite.go代码时不传递参数,则会执行以下运行时错误.

panic: runtime error: index out of range

goroutine 1 [running]:
runtime.panic(0x80c8540, 0x816d4b7)
/usr/lib/go/src/pkg/runtime/panic.c:266 +0xac
main.main()
/home/jacob/github/gosite/src/github.com/zachdyer/gosite/gosite.go:11 +0x168
Run Code Online (Sandbox Code Playgroud)

错误发生在第11行.所以我的问题是我os.Args是以错误的方式使用?这需要以不同的方式初始化吗?为什么它似乎在那里无限循环?如果我传入一个参数,程序运行时没有任何错误并打印参数.

import (
    "fmt"
    "os"
)

var root string

func main() {
    command := os.Args[1]
    if command != "" {
        fmt.Println(command)
    } else {
        command = ""
        fmt.Println("No command given")
    }

    createDir("public")
    createDir("themes")
}

func createDir(dir string) {
    root = "../../../../"
    err := os.Mkdir(root + dir, 0777)
    if err != nil {
        fmt.Println(err)
    }

}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 17

首先检查os.Args切片的长度,并仅索引其长度 - 1:

if len(os.Args) > 1 {
    command := os.Args[1]
    // do something with command
} else {
    // No arguments were specified!
}
Run Code Online (Sandbox Code Playgroud)

os.Args 保存命令行参数,从程序名称开始.

os.Args[0]是程序名称.如果有争论,他们会去Args[1],Args[2]......

如果未指定参数,则长度os.Args将为1,并且仅保存程序名称.

此外,为了更容易和更复杂的参数处理检查flag包.