我有一个包含切片的结构,我想将它用作映射的键。我知道这是不允许的,因为当前没有为 Go 中的切片定义相等性。我也知道我不能覆盖结构的相等性来手动进行切片比较。我的问题是:在这里完成我想要做的事情的最惯用的方法是什么?这是一些示例代码,使结构更加清晰:package mainimport "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”两次的等效代码。实现这一结果的最佳方法是什么?
2 回答
qq_笑_17
TA贡献1818条经验 获得超7个赞
即使您根据“相同的 ptr、cap 和 len”定义了切片相等性,您想要的仍然无法正常工作,因为示例中的切片指向不同的底层内存,因此需要进行深入分析并破坏速度地图访问。
即使有一个调用的接口Hasher
,您可以实现并使您的类型可映射,您的示例仍然需要逐个元素检查、结果哈希的记忆以及跟踪切片是否已更改的某种方法。我可能会建议您只使用 a map[*ContainerStruct]int
并处理这样一个事实,即从概念上讲,您可能有两个不同的结构指针,它们的切片成员具有相同的数据。
鉴于所有这些,我可能会建议首先重新构建架构,如果失败,则采用上面 Dave C. 的建议,以及对哈希值的某种记忆以及某种跟踪何时需要重新计算的方法。
翻阅古今
TA贡献1780条经验 获得超5个赞
您不能使用切片作为映射键,但如果您知道此类切片的大小,则可以改用数组。允许数组作为映射键。
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)
}
- 2 回答
- 0 关注
- 206 浏览
添加回答
举报
0/150
提交
取消