【问题标题】:slice bounds out of range error and i don't have any slice variable切片边界超出范围错误,我没有任何切片变量
【发布时间】:2017-08-04 10:14:37
【问题描述】:

我正在做一个项目,我有一个错误说切片边界超出范围,但与此错误有关的行似乎不是一个 slive 变量:

bt.blockDateTime =bt.getDate(bt.getDateBlockHeader(header[10:22]))
serviceType := hex2decimal(record[56:58])

这是我创建并使用过的函数:

func(bt *Hc34) getDateBlockHeader(input string) string{
        year := input[0:2]
        quant:= hex2decimal(input[3:6])
        hour := input[6:len(input)];
        /*if err!=nil{
            panic(err)
        }*/
        return "20" + year + bt.getQuantDate(quant) + "" + hour
    }
func(bt *Hc34) getDate(date string) string{
        year := date[0:4]
        month := date[4:6]
        day := date[6:8]
        hour := date[8:10]
        minute := date[10:12]
        second := date[12:14]
        return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
    }
func(bt *Hc34) getQuantDate(quant int) string{
        nanoDayOfYear:=strconv.FormatInt(int64(quant)*24*60*60*1000*1000*1000, 10) + "ns"
        durt,err:=time.ParseDuration(nanoDayOfYear)
        t := time.Date(2009, time.January, 01, 00, 0, 0, 0, time.UTC)
        t=t.Add(durt)
        if err!=nil{

            panic(err)
        }
        return string(t.Month())+""+string(t.Day())

    }
func hex2decimal(hexStr string) int{
    integer,_:=strconv.ParseInt(hexStr,0,64)
    return int(integer)

}

这里是错误行: 恐慌:运行时错误:切片超出范围

goroutine 1 [running]:
github.com/bob96/hc34/beater.(*Hc34).hc34decoderfunc(0xc420238380, 0xc4202cc000, 0x2d128)
    /home/hp/src/github.com/bob96/hc34/beater/hc34.go:190 +0xb60
github.com/bob96/hc34/beater.(*Hc34).hc34DataHolderfunc(0xc420238380, 0xc42016e3c0, 0x5e)
    /home/hp/src/github.com/bob96/hc34/beater/hc34.go:141 +0xd3
github.com/bob96/hc34/beater.(*Hc34).Run(0xc420238380, 0xc420176000, 0xc4201760a8, 0xb)
    /home/hp/src/github.com/bob96/hc34/beater/hc34.go:105 +0x109
github.com/bob96/hc34/vendor/github.com/elastic/beats/libbeat/beat.(*Beat).launch(0xc420176000, 0x9a84e8, 0x0, 0x0)
    /home/hp/src/github.com/bob96/hc34/vendor/github.com/elastic/beats/libbeat/beat/beat.go:211 +0x706
github.com/bob96/hc34/vendor/github.com/elastic/beats/libbeat/beat.Run(0x9855d5, 0x4, 0x0, 0x0, 0x9a84e8, 0xc4200001a0, 0xc4200001a0)
    /home/hp/src/github.com/bob96/hc34/vendor/github.com/elastic/beats/libbeat/beat/beat.go:136 +0x65
main.main()
    /home/hp/src/github.com/bob96/hc34/main.go:12 +0x54

谁能帮帮我,这将是一种祝福!

【问题讨论】:

    标签: go


    【解决方案1】:

    好吧,每当你编写类似的代码时

    x := y[a:b]
    

    你正在有效地切片。我建议您在对其进行任何处理之前检查“标题”和“记录”的长度。

    希望对你有帮助。

    【讨论】:

    • 标头的长度为 64,记录为 84,我只想从其中的一部分获取数据
    • 您可以在每个接受字符串输入切片的函数内部添加边界检查,这可能会帮助您找到错误。例如,在 getDate() 内部添加一个检查以查看日期是否确实具有至少 14 的长度,否则如果您犯了错误并在空日期或短日期上运行,您将看到该错误。您的代码中到处都有切片,以及未经检查/检查的后期错误(例如,直到您在 getQuantDate 中使用 durt 后才检查错误...)修复您的错误检查,您会发现错误。
    【解决方案2】:

    字符串是 Go 中的一段字符。这就是为什么你可以像record[56:58] 这样对字符串进行切片。

    你需要在切片之前检查字符串的长度以避免恐慌。

    有点像

    if len(string)<requiredLen{
      return
    }
    a := string[requiredLen-2:requiredLen]
    

    【讨论】:

    • 我的字符串长度为84
    • 如果你能在问题中添加你得到的错误和行号会很有帮助。
    • @boubkerelamri 您还需要在代码 sn-p 中添加相应的行号。或者您可以添加一个play.golang.org 链接来提供一个最小、完整和可验证的示例。 stackoverflow.com/help/mcve
    • 我没明白对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多