Golang命令参数为空导致错误

时间:2015-05-18 11:28:55

标签: 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

错误发现在第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)
    }

}

2 个答案:

答案 0 :(得分:15)

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

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

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

os.Args[0]是程序名称。 如果有参数,则会转到Args[1]Args[2] ...

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

另外,对于更简单,更复杂的参数处理,请查看flag包。

答案 1 :(得分:-1)

在访问os.Args之前,你必须首先检查os.Args是否存在以及它有多大。这在使用数组的非常编程语言中是最好的。

这应该有效:

func main() {

    if (os.Args != nil && len(os.Args) > 1) {
        command := os.Args[1]
        if command != "" {
            fmt.Println(command)
        } else {
            command = ""
            fmt.Println("No command given")
        }
    }
    createDir("public")
    createDir("themes")
}

取决于所有那些只能去的故障查找器,并且在这里重新阅读了手册,正确的仅用于处理输入参数的特定版本。 (注意,因为我以前很伤心,我没有开发,我通过处理数组的最佳实践回答,以防止超出范围错误):

func main() {

    if (len(os.Args) > 1) {
        command := os.Args[1]
        if command != "" {
            fmt.Println(command)
        } else {
            command = ""
            fmt.Println("No command given")
        }
    }
    createDir("public")
    createDir("themes")
}
  1. 不再检查nil了,因为os.Args总是被初始化并且在索引0上保存应用程序名称
  2. 检查len大于1,以确保索引1存在。或者换句话说,用户输入了参数,os.Args有更多条目,只有应用程序名称。