Голанг: как мне справиться с ошибкой индекса вне диапазона?

Я пишу интерфейсную программу 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)неверно и в этом контексте. Я думаю, что «печать справочного текста» - это допустимый вариант использования, а не ошибка.

Другие вопросы по тегам