整数映射 - > Go中的2d切片

时间:2014-02-07 07:16:37

标签: go

我希望有一个整数映射到不同维度的切片。

var SIZE_TO_PERM = make(map[int][][]uint32, 3)

var THREE_C_THREE = [...][3]int {
    {0, 1, 2},
}

var FOUR_C_THREE = [...][3]int {
    {0, 1, 2}, {0, 1, 3}, {0, 3, 2}, {3, 1, 2},
}

var FIVE_C_THREE = [...][3]int {
    // ... etc
}

func init() {
    SIZE_TO_PERM = map[int][][]uint32 {
        3 : THREE_C_THREE,
        4 : FOUR_C_THREE,
        5 : FIVE_C_THREE,
    }
}

但是这并不起作用,因为Go会抛出错误:

# command-line-arguments
./test.go:96: cannot use THREE_C_THREE (type [1][5]int) as type [][]uint32 in map value
./test.go:97: cannot use FOUR_C_THREE (type [4][5]int) as type [][]uint32 in map value
./test.go:98: cannot use FIVE_C_THREE (type [20][5]int) as type [][]uint32 in map value

我该如何解决这个问题?也许我可以以某种方式将Go映射为指向地图的指针/引用?然后所有类型都是相同的,我只需要按照地址来获取地图。问题是我不知道apriori我找到哪种类型...

Go的所有新手,所以任何提示都会受到赞赏。

1 个答案:

答案 0 :(得分:4)

首先,切片数组之间存在差异。

var a [3]int // Array of 3 ints
var s []int // Slice of ints

在您的情况下,地图可以存储切片,但数据存储在不同类型的数组中。

数组的大小是其类型的一部分。由于Go的严格类型,您不能将一个数组类型/大小的值设置为不同数组类型/大小的值。

相反,我们有切片。切片使用底层数组,但长度和容量可能不同。

您可以通过更改代码来解决问题:

var THREE_C_THREE = [][]uint32 { // Changed type from [1][3]int to [][]uint32
    {0, 1, 2},
}

var FOUR_C_THREE = [][]uint32 { // Changed type from [4][3]int to [][]uint32
    {0, 1, 2}, {0, 1, 3}, {0, 3, 2}, {3, 1, 2},
}

var FIVE_C_THREE = [][]uint32 { // Changed type from [5][3]int to [][]uint32
    // ... etc
}

此官方博客文章将为您提供更多信息:http://blog.golang.org/slices
这篇文章也是:http://blog.golang.org/go-slices-usage-and-internals