GoLang:在函数中分配切片切片会导致索引超出范围

时间:2013-09-27 18:16:49

标签: go slice

我一直在Go尝试一些事情,而且我遇到了一个我无法解决的问题。

package main

import "fmt"
import "strconv"

func writeHello(i int, ) {
        fmt.Printf("hello, world "+strconv.Itoa(i)+"\n")
}

type SliceStruct struct {
    data [][]int;
}

func (s SliceStruct) New() {
    s.data=make([][]int,10);
}

func (s SliceStruct) AllocateSlice(i int) {
    s.data[i]=make([]int,10);
}

func (s SliceStruct) setData(i int, j int, data int) {
    s.data[i][j] = data;
}

func (s SliceStruct) getData(i int, j int) int {
    return s.data[i][j]
}

func useSliceStruct(){
    sliceStruct := SliceStruct{};
    sliceStruct.New();
    for i := 0; i < 10; i++ {
        sliceStruct.AllocateSlice(i);
        for j:=0; j<10; j++ {
             sliceStruct.setData(i,j,i);
            writeHello(sliceStruct.getData(i,j));
        }
    }
}

func dontUseSliceStruct(){
    data:=make([][]int,10);
    for i := 0; i < 10; i++ {
        data[i]=make([]int,10);
        for j:=0; j<10; j++ {
            data[i][j] = i;
            writeHello(data[i][j]);
        }
    }
}

func main() {
    dontUseSliceStruct();
    useSliceStruct();
}

当它到达函数useSliceStruct时,代码在第一次调用AllocateSlice()时失败,索引超出范围错误。

据我所知,这两种方法的代码确实是完美的事情。那我错过了什么?

1 个答案:

答案 0 :(得分:1)

DOH,刚刚解决了。

我没有在函数声明中使用对结构的引用。

func (s SliceStruct)

应该是

func (s *SliceStruct)