【发布时间】:2023-03-28 14:06:01
【问题描述】:
假设我有很多不同的结构类型都满足一个接口Food。
type Food interface {
Name() string
Tastiness() int
}
type fruit struct {
species string
numSeeds int
}
type vegetable struct {
commonName string
weight int
}
func (f *fruit) Name() string { return f.species }
func (f *fruit) Tastiness() int { return 100 - f.numSeeds }
func (v *vegetable) Name() string { return v.commonName }
func (v *vegetable) Tastiness() int { return 1 }
满足Food 接口的结构使用pointer receivers 的函数来实现,因为我经常传递它们,如果没有指针,这很笨拙。
通常,我想在food1 和food2 之间进行比较,因此我构建了类似于foodmap := map[Food]bool 的地图。我真正想检查的是底层结构是否相同。但是,因为满足接口的总是指针,所以如果我创建两个相同类型的 fruit 或 vegetable,我就不能使用映射或列表进行相等或存在测试。
是比较Foods 与不使用map[Food]bool 而是使用类似map[FoodKey] 的最佳方法,其中满足Food 的任何结构都提供FoodKey() comparisonStruct 方法返回一个严格用于比较的结构?
【问题讨论】:
-
您能否详细说明“我真正想检查的是底层结构是否相同”?
-
如果你只有两个
Food,你想确保你正在比较两个fruit:类型断言或类型切换(参见规范)。或者:反射。注意:您的问题与指针无关(据我了解您的问题)。第二个注释:“......因为我经常传递它们,没有指针就很笨拙。”在一般情况下是不正确的。传递值非常好,而且通常比指针更快。 -
也许我不清楚:问题确实与指针有关,因为如果结构(不是指向结构的指针)满足接口,我可以进行相等性检查(指针不成立)。见这里:play.golang.org/p/nWamIr0A6H。我知道这在一般情况下是不正确的,但对我来说是正确的,因为结构很大。