Closed. This question is not reproducible or was caused by typos。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




我正在尝试将字符串值与 slice 中的值进行比较,在我的情况下, slice 为​​ 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

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

最佳答案

此代码块中有几个错误,因此让我们开始:

  • 首先,您需要在taglistlength这一行之后再次定义tagsList = [{ID00001 Band 9 B PERMANENT}{ID00002 Band 8 C PERMANENT}{ID00003 Band 7 C Temporary}] 。我认为该行的位置错误,因为您甚至在该行之后定义了tagList,如果是这样,请编辑您的问题。
  • 如@icza在评论中所述,您必须执行i<taglistLength,而不是<=。在Go中,数组的索引为0,因此等于数组长度的索引超出范围。
  • 如果您想安全起见,可以执行for _,tag:= range tagsList{...}。这是一个foreach块。现在您可以使用tag而不是tagList[i]。许多人反对使用它,但这仍然是一个选择。它还可以防止出现错误。
  • 您不需要在每个tagListLength>0块中检查else if。第一个足以满足您的逻辑。这只是一个建议。

  • 因此,最后,请使用golang的foreach版本,或将条件固定为i<taglistLength,并确保在正确的行上初始化taglistLength

    10-07 19:42