我有一个特定的Go lang结构对象,我正在与之交互,我希望它与自己相等 . 我将函数传递给一个只返回它的函数,但是通过接受接口{}输入/输出来实现它
type Animal struct {
name string
food interface{}
}
type YummyFood {
calories int
}
func echo_back(input interface{}) interface{} {
return input
}
func main() {
var tiger_food = Food{calories: 1000}
var tiger = Animal{name: "Larry", food: tiger_food}
output_tiger := echo_back(tiger)
fmt.Printf("%T, %+v\n", tiger, tiger)
fmt.Printf("%T, %+v\n", output_tiger, output_tiger)
fmt.Println(tiger == output_tiger)
fmt.Println(tiger == output_tiger.(Animal))
}
运行它,您会看到tiger和output_tiger看起来是相同的并且评估为相等 . 大 . 这就是我所期待的 . 现在,尝试使用YummyFood的这个定义
type YummyFood {
calories int
ingredients []string
}
突然之间,即使使用类型断言,echo_back的输出也不会评估为与输入相同 . 我得到'恐慌:运行时错误:比较无法比较的类型YummyFood'
问题是为什么添加[]字符串类型会导致输入和输出无法比较?如何修改output_tiger以取回我放入的相同内容(即我希望它与'tiger'相同) . 我如何反映output_tiger使它等于老虎?
2 回答
切片(
[]string
)没有定义相等 . 包含定义相等的成员的数组和结构将定义相等 .来自http://golang.org/doc/go1.html#equality
它不会很快,但您可以使用reflect.DeepEqual()来比较切片(或只是YummyFood) . 它完成循环来比较所有元素的工作 . 你可以做一个更有效的功能,但是如果那个能够为你自己节省一些工作,也许还有一些bug . :-)