我有一个包含 slice 的结构,我想将其用作 map 的键。我知道这是不允许的,因为当前在Go中没有为 slice 定义相等性。我也知道,我不能为结构重写等式来手工进行 slice 比较。我的问题是:完成我在这里试图做的最惯用的方法是什么?
这是一些示例代码,使结构更清晰:
package main
import "fmt"
type InternalStruct struct {
item1, item2 bool
}
type ContainerStruct struct {
internals []InternalStruct
}
func main() {
container1 := ContainerStruct{}
container1.internals = append(container1.internals, InternalStruct{item1: true})
container2 := ContainerStruct{}
container2.internals = append(container2.internals, InternalStruct{item1: true})
m := make(map[ContainerStruct]int)
m[container1] = 10
fmt.Printf("container1 maps to: %d\n", m[container1])
fmt.Printf("container1 maps to: %d\n", m[container2])
}
该代码未编译(按预期方式),但是我正在寻找等效的东西,它将两次输出“10”。实现此结果的最佳方法是什么?
最佳答案
您不能将slice用作映射键,但是如果知道此类slice的大小,则可以改用数组。数组可以用作映射键。
package main
import "fmt"
func main() {
m := make(map[[2]int]int)
m[[2]int{1, 2}] = 3
m[[2]int{3, 4}] = 1
fmt.Println(m)
}
Playground