Golang 命令参数为空导致错误
Golang command arguments empty causing error
我正在编写一个 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
?这是否需要以不同的方式初始化?另外为什么它似乎在那里无限循环?如果我传入参数,程序 运行s 没有任何错误并打印参数。
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)
}
}
首先检查 os.Args
切片的长度,只索引到它的长度 - 1:
if len(os.Args) > 1 {
command := os.Args[1]
// do something with command
} else {
// No arguments were specified!
}
os.Args
hold the command-line arguments, starting with the program name.
os.Args[0]
是程序名。 如果有参数,它们会转到Args[1]
、Args[2]
...
如果未指定参数,os.Args
的长度将为 1,并且仅包含程序名称。
另外,为了更简单和更复杂的参数处理,请查看 flag
包。
您必须先检查 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")
}
取决于这里所有的故障查找器只能去,并且已经阅读了这里的手册正确的只能去特定版本来处理输入参数。 (我以前很伤心,我没有开发 go,我通过处理数组的最佳实践来回答,以防止超出范围的错误):
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")
}
- 它不再检查 nil,因为 os.Args 总是被初始化并将应用程序名称保存在索引 0
- 它检查大于 1 的 len 以确保索引 1 存在。或者换句话说,用户输入了参数,os.Args 的条目数比应用名称多。
我正在编写一个 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
?这是否需要以不同的方式初始化?另外为什么它似乎在那里无限循环?如果我传入参数,程序 运行s 没有任何错误并打印参数。
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)
}
}
首先检查 os.Args
切片的长度,只索引到它的长度 - 1:
if len(os.Args) > 1 {
command := os.Args[1]
// do something with command
} else {
// No arguments were specified!
}
os.Args
hold the command-line arguments, starting with the program name.
os.Args[0]
是程序名。 如果有参数,它们会转到Args[1]
、Args[2]
...
如果未指定参数,os.Args
的长度将为 1,并且仅包含程序名称。
另外,为了更简单和更复杂的参数处理,请查看 flag
包。
您必须先检查 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")
}
取决于这里所有的故障查找器只能去,并且已经阅读了这里的手册正确的只能去特定版本来处理输入参数。 (我以前很伤心,我没有开发 go,我通过处理数组的最佳实践来回答,以防止超出范围的错误):
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")
}
- 它不再检查 nil,因为 os.Args 总是被初始化并将应用程序名称保存在索引 0
- 它检查大于 1 的 len 以确保索引 1 存在。或者换句话说,用户输入了参数,os.Args 的条目数比应用名称多。