我在运行以下代码时出现索引超出范围错误

问题描述:

i having the following code to print the indexes of an array which contains similar values.

but on running this code getting panic: indexes out of range run time error

why i am getting this

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)

}

copy_numbers is of size 0, just as you initialized it.

If I add the following before your first for loop:

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

I get:

[5 2 3 5 3]
[]

the copy builtin copies up to the length of either argument, as mentioned in the docs:

Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).

You should initialize copy_numbers to be of the same length as numbers

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

len(copy_numbers) is zero because copy will only copy min(len(src), len(dst)) elements and copy_numbers length is zero.

Use this line to define a bigger copy_numbers so copy does what you want:

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

From the documentaion:

The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).

in your case, the destination is copy_numbers, which is an uninitialized slice. To initialize it, and have enough space to hold a copy of numbers you can simply do

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

The issue is with the way you've used copy. From the docs:

Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).

The manner in which you are creating copy_numbers initializes it with a zero length.

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

This causes copy to not copy a single element from numbers.

To fix this, you can change copy_numbers initialization to:

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

The rest of the code should work.