为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中使用包含切片字段的结构作为映射键的惯用方法是什么?

在 Go 中使用包含切片字段的结构作为映射键的惯用方法是什么?

Go
精慕HU 2021-10-04 15:33:04
我有一个包含切片的结构,我想将它用作映射的键。我知道这是不允许的,因为当前没有为 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. 的建议,以及对哈希值的某种记忆以及某种跟踪何时需要重新计算的方法。


查看完整回答
反对 回复 2021-10-04
?
翻阅古今

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)

}


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信