猿问

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

我有一个包含切片的结构,我想将它用作映射的键。我知道这是不允许的,因为当前没有为 Go 中的切片定义相等性。我也知道我不能覆盖结构的相等性来手动进行切片比较。我的问题是:在这里完成我想要做的事情的最惯用的方法是什么?


这是一些示例代码,使结构更加清晰:


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”两次的等效代码。实现这一结果的最佳方法是什么?


精慕HU
浏览 207回答 2
2回答

qq_笑_17

即使您根据“相同的 ptr、cap 和 len”定义了切片相等性,您想要的仍然无法正常工作,因为示例中的切片指向不同的底层内存,因此需要进行深入分析并破坏速度地图访问。即使有一个调用的接口Hasher,您可以实现并使您的类型可映射,您的示例仍然需要逐个元素检查、结果哈希的记忆以及跟踪切片是否已更改的某种方法。我可能会建议您只使用 a map[*ContainerStruct]int并处理这样一个事实,即从概念上讲,您可能有两个不同的结构指针,它们的切片成员具有相同的数据。鉴于所有这些,我可能会建议首先重新构建架构,如果失败,则采用上面 Dave C. 的建议,以及对哈希值的某种记忆以及某种跟踪何时需要重新计算的方法。

翻阅古今

您不能使用切片作为映射键,但如果您知道此类切片的大小,则可以改用数组。允许数组作为映射键。package mainimport "fmt"func main() {    m := make(map[[2]int]int)    m[[2]int{1, 2}] = 3    m[[2]int{3, 4}] = 1    fmt.Println(m)}
随时随地看视频慕课网APP

相关分类

Go
我要回答