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

for循环中的索引超出范围

for循环中的索引超出范围

Go
繁华开满天机 2023-05-15 14:33:09
我正在尝试将字符串值与切片中的值进行比较,在我的例子中切片是tagsList。我必须在这个比较上做一些功能。请找到我下面的代码。        var taglistlength = len(tagsList)        var tagFlag bool        var i int        var reEmplKey string        type saveDetails struct {            BankID           string  `json:"bankID"`                LocalGradeDescr  string  `json:"localGradeDescr"`               RegularTemporary string  `json:"regularTemporary"`        }        var tagsList = make([]saveDetails, 0)         reEmplKey = "ID00001"        tagsList = [{ID00001 Band 9 B PERMANENT}{ID00002 Band 8 C PERMANENT}{ID00003 Band 7 C Temporary}]         fmt.Println("taglistlength : ",taglistlength)        for i = 0; i <= taglistlength; i++{             fmt.Println("tagsList : ",tagsList)            if (taglistlength == 0){                tagFlag = true                fmt.Println("1st condition : ",tagFlag)            } else if (taglistlength > 0 && tagsList[i].BankID ==reEmplKey){                tagFlag = false                fmt.Println("2nd condition : ",tagFlag)            } else if (taglistlength > 0 && tagsList[i].BankID !=reEmplKey){                tagFlag = false                fmt.Println("3rd condition : ",tagFlag)            }else{                fmt.Println("error")            }        }        if (tagFlag == true){         //do some operation        }执行此代码时出现以下错误:    panic: runtime error: index out of range    panic: runtime error: invalid memory address or nil pointer dereference    [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x8ca606]它在第一次循环中正确执行并在第二次循环中显示错误。请在下面找到我的输出:      taglistlength :  0      tagsList : []      1st condition :  true      taglistlength :  1      tagsList :  [{1000000 Band 9 B PERMANENT }]      3rd condition :  false      tagsList :  [{1000000 Band 9 B PERMANENT }]      panic: runtime error: index out of range      panic: runtime error: invalid memory address or nil pointer dereference请帮我解决这个问题。我知道我犯了一些愚蠢的逻辑错误,但我无法弄清楚问题所在。如果我能得到工作代码,那将非常有帮助。
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

这个代码块中有几个错误,所以让我们开始吧:

  • 首先你需要在这一行之后taglistlength 再次tagsList = [{ID00001 Band 9 B PERMANENT}{ID00002 Band 8 C PERMANENT}{ID00003 Band 7 C Temporary}]定义你的。我相信该行在错误的位置,因为您甚至tagList在那行之后定义,如果是这样,请编辑您的问题。

  • 您必须做i<taglistLength,而不是<=。在 Go 中,数组是从 0 开始索引的,因此等于数组长度的索引是越界的。

  • 如果您想安全起见,可以这样做for _,tag:= range tagsList{ ...}。这是一个foreach块。现在你可以使用taginstead of 了。tagList[i]很多人反对使用它,但它仍然是一个选择。它还可以防止越界错误。

  • 您不需要检查tagListLength>0每个else if块。第一个足以满足您的逻辑。这只是一个建议。

所以最后,要么使用foreachgolang 版本,要么将你的条件修改为i<taglistLength,并确保你taglistLength在正确的行初始化。


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信