繁体   English   中英

包含切片的结构集

[英]Set of structs containing a slice

我正在尝试实现玩具搜索算法,并且需要维护一组探索状态。 状态是一个结构:

type VWState struct {
    botLocation   VWCoords
    dirtLocations []VWCoords
}

我的第一个想法是可以使用map[VWState]bool实现一个简单的Set,但是我似乎还没有找到使它起作用的方法。 如果尝试使用VWState作为地图的键, VWState出现以下恐慌:

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

有没有办法使这项工作? 我可以为该结构实现自定义哈希函数,还是应该寻找其他实现此结构的方法?

任何帮助将不胜感激。

您可以将指向结构的指针用作映射键:

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
}

如果dirtLocations有合理的最大长度,则可以使用数组而不是切片。 数组是可哈希的(假设元素是可哈希的)。

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

然后,您需要添加有效dirtLocations数量的dirtLocations或检测dirtLocations的零值来VWCoords dirtLocations有多少个插槽有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM