Голанг: как мне справиться с ошибкой индекса вне диапазона?
Я пишу интерфейсную программу CLI в программе Go.my требует от пользователя ввести имя файла в качестве аргумента. Ниже приведен код, который я написал для обработки ситуаций, в которых пользователь не вводит никаких аргументов. но он паникует и выдает ошибку "индекс вне диапазона". как мне справиться с этим?
package main
import (
"encoding/hex"
"fmt"
"io/ioutil"
"log"
"os"
)
func main() {
if len(os.Args) == 0 {
fmt.Println("usage: gohex <filename>")
os.Exit(1)
} else {
filename := os.Args[1]
data, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal(err)
}
fmt.Println(hex.Dump(data))
}
}
2 ответа
Ваша проблема опирается на эту строку:
if len(os.Args) == 0
Вы проверяете первый аргумент, который, как вы и предполагали, должен быть именем файла, но на самом деле это имя файла go / исполняемого файла. Поэтому, если вы хотите проверить, был ли предоставлен аргумент, вам нужно проверить, что длина аргумента больше 1
, Измените код на:
if len(os.Args) <= 1 {
log.Fatal("usage: gohex <filename>")
}
У другого ответа есть пара проблем. Это проверка:
len(os.Args) <= 1
но
len(os.Args)
всегда должно быть как минимум
1
, поэтому используя
<=
бессмысленно. Далее, в этом конкретном случае,
len
ничего кроме
2
также недействителен. Так что просто проверьте это:
package main
import "os"
func main() {
if len(os.Args) != 2 {
println("gohex <filename>")
return
}
filename := os.Args[1]
println(filename)
}
Боковое примечание, лично я также думаю об использовании
os.Exit(1)
неверно и в этом контексте. Я думаю, что «печать справочного текста» - это допустимый вариант использования, а не ошибка.