我在运行下面的代码时得到索引超出范围错误

时间:2018-01-06 14:25:29

标签: go

我有以下代码来打印包含类似值的数组的索引。

但是在运行此代码时出现恐慌:索引超出范围运行时错误

为什么我得到这个

package main

import "fmt"

func main()  {
    var numbers[] int = [] int {5,2,3,5,3}
    var copy_numbers[] int
    var count [5] int
    var i,j int
    copy(copy_numbers,numbers)
    for i=0;i<len(numbers);i++ {
        for j=0;j<len(numbers) ;j++  {
            if numbers[i]==numbers[j] {
                count[i]++;
            }
        }
    }
    fmt.Printf("%d",count)

    for i=0;i<len(numbers) ;i++  {
        fmt.Println("hello")
        if count[i]>1{
            for j=0;j<len(numbers) ;j++  {
                if numbers[i]==copy_numbers[j] {

                    fmt.Printf("%d",j)

                }
            }
            fmt.Println("")
        }
    }

fmt.Printf("%d",count)

}

4 个答案:

答案 0 :(得分:0)

len(copy_numbers)为零,因为copy只复制min(len(src), len(dst))个元素,copy_numbers长度为零。

使用此行定义更大的copy_numbers,以便copy执行您想要的操作:

copy_numbers[] := make([]int, len(numbers))

答案 1 :(得分:0)

copy_numbers的大小为0,就像您初始化它一样。

如果我在第一个for循环之前添加以下内容:

fmt.Println(numbers)
fmt.Println(copy_numbers)

我明白了:

[5 2 3 5 3]
[]

copy内置复制到任一参数的长度,如文档中所述:

  

复制返回复制的元素数,这将是最小值   len(src)和len(dst)。

您应该将copy_numbers初始化为与numbers

相同的长度
  copy_numbers := make([]int, len(numbers))

答案 2 :(得分:0)

来自文件:

  

复制内置函数将元素从源切片复制到目标切片。 (作为一种特殊情况,它还会将字符串中的字节复制到一个字节片段。)源和目标可能重叠。 Copy返回复制的元素数,这将是len(src)和len(dst)的最小值。

在您的情况下,目标是copy_numbers,这是一个未初始化的切片。要初始化它,并有足够的空间来保存numbers的副本,您只需执行

即可

copy_numbers := make([]int, len(numbers)

答案 3 :(得分:0)

问题在于您使用copy的方式。来自docs

  

复制返回复制的元素数,这将是最小值   len(src)和len(dst)。

您创建copy_numbers的方式使用零长度初始化它。

var copy_numbers []int // len(copy_numbers) == 0

这会导致copy不从numbers复制单个元素。

要解决此问题,您可以将copy_numbers初始化更改为:

copy_numbers := make([]int, len(numbers))

其余代码应该可以使用。