猿问

for循环中的索引超出范围

我正在尝试将字符串值与切片中的值进行比较,在我的例子中切片是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

请帮我解决这个问题。我知道我犯了一些愚蠢的逻辑错误,但我无法弄清楚问题所在。如果我能得到工作代码,那将非常有帮助。


繁华开满天机
浏览 122回答 1
1回答

一只斗牛犬

这个代码块中有几个错误,所以让我们开始吧:首先你需要在这一行之后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在正确的行初始化。
随时随地看视频慕课网APP

相关分类

Go
我要回答