包含切片的结构集

时间:2014-10-20 21:33:47

标签: search go

我试图实施玩具搜索算法并需要维护一组探索状态。状态是结构:

type VWState struct {
    botLocation   VWCoords
    dirtLocations []VWCoords
}

我的第一个想法是,可以使用map[VWState]bool实现一个简单的Set,但我似乎无法找到一种方法来使其工作。如果我尝试使用VWState作为地图的关键字,我会遇到以下恐慌:

Panic: runtime error: hash of unhashable type vw.VWState (PC=0x40EB0D)

有没有办法让这项工作?我可以为结构实现自定义散列函数,还是应该考虑其他一些实现方法?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用指向结构的指针作为地图键:

map[*VWState]bool

如果您希望能够比较等效结构,可以创建一个方法来输出地图的关键字。 String()会很方便,因为您也可以使用它来打印结构,或者使用哈希函数并输出更短的内容,甚至是int

这样简单的东西就足够了,但如果你愿意的话可以缩短输出(注意不要在你的格式行中递归调用String()):

func (s VWState) String() string {
    return fmt.Sprintf("%#v", s)
}

func main() {
    m := make(map[string]bool)
    s := VWState{}
    m[s.String()] = true
}

答案 1 :(得分:1)

如果dirtLocations有合理的最大长度,那么您可以使用数组而不是切片。数组是可清除的(假设元素是可清除的)。

type VWState struct {
    botLocation   VWCoords
    dirtLocations [4]VWCoords
}

然后,您需要添加有效dirtLocations数量的计数或检测VWCoords的零值,以计算出dirtLocations中的有效插槽数。< / p>