【发布时间】:2023-03-13 07:40:01
【问题描述】:
我有一个包含切片的结构,我想将其用作映射的键。我知道这是不允许的,因为目前尚未为 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”的等效代码。实现此结果的最佳方法是什么?
【问题讨论】:
-
也许使用哈希作为键?例如。 play.golang.org/p/zzvF2EVxrk 只会更好。基本上,在您的类型上创建一个方法,该方法返回可用作映射键的内容。
-
感谢 Dave,这绝对是一个行之有效的解决方案。它看起来确实有点骇人听闻,但我不知道有什么更好的方法。
-
链接代码中的 hack 仅在于密钥是如何生成的(我只是做了一些丑陋的演示)。您可以自己想办法为您自己的数据集为每个项目生成唯一的密钥。如果这不适合您,那么您需要寻找替代方案。
标签: dictionary struct go key slice