我有以下代码来打印包含类似值的数组的索引。
但是在运行此代码时出现恐慌:索引超出范围运行时错误
为什么我得到这个
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)
}
答案 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))
其余代码应该可以使用。