我有一个包含 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

10-04 11:37