为了账号安全,请及时绑定邮箱和手机立即绑定

golang:如何处理索引超出范围错误?

golang:如何处理索引超出范围错误?

Go
慕妹3146593 2022-01-10 15:12:02
我正在用 Go 编写一个 CLI 接口程序。我的程序需要用户输入文件名作为参数。以下是我为处理用户不输入任何参数的情况而编写的代码。但它会恐慌并给出错误“索引超出范围”。我该如何处理?  package mainimport (    "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 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

您的问题取决于这一行:


if len(os.Args) == 0

您正在检查您认为应该是文件名的第一个参数,但实际上是 go / 可执行文件名。因此,如果您想检查是否提供了参数,则需要检查参数长度是否大于1. 将代码更改为:


if len(os.Args) <= 1 {

    log.Fatal("usage: gohex  <filename>")

}


查看完整回答
反对 回复 2022-01-10
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

另一个答案有几个问题。它有这个检查:


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)

}

旁注,我个人也认为 usingos.Exit(1)在这种情况下也是无效的。我认为“打印帮助文本”是一个有效的用例,而不是错误。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号