我希望有一个整数映射到不同维度的切片。
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的所有新手,所以任何提示都会受到赞赏。
答案 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