2017-08-04 144 views
0

我正在一个项目上,我有一个错误说,切片界限超出范围,但与此错误有关的行似乎不是一个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 

有人能帮助我请它是一个祝福!

回答

1

字符串是Go中的一部分字符。这就是为什么你能够像record[56:58]那样切分字符串的原因。

为了避免恐慌,您需要在对其进行切片之前检查该字符串的长度。

喜欢的东西

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

我的字符串长度为84 –

+0

我不知道为什么我有这个错误 –

+1

如果您可以在问题中添加您收到的错误和行号,这将有所帮助。 –

1

好了,只要你写的代码像

x := y[a:b] 

你实际上切片。我建议你在做任何处理之前检查“标题”和“记录”的长度。

希望它有帮助。

+0

头长度为64和记录84,我只是想从它的一部分获取数据 –

+0

你可以添加边界检查每个函数需要一个字符串输入的切片,这可能会帮助您找到您的错误。例如,在getDate()的内部添加一个检查来确定日期是否确实具有至少14的长度,否则如果你犯了一个错误,并在空日期或短日期运行,你会看到这个错误。代码中的任何位置都有切片,并且未检查/检查延迟的错误(例如,直到在getQuantDate中使用durt之后才检查错误)。修复错误检查并发现错误。 – Qubert