使用[]字符串字段时出现无法比较的类型错误(Go lang)

dgh*_*dgh 10 go

我有一个特定的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))

}
Run Code Online (Sandbox Code Playgroud)

运行它,您会看到tiger和output_tiger看起来是相同的并且评估为相等.大.这就是我所期待的.现在,尝试使用YummyFood的这个定义

type YummyFood {
    calories int
    ingredients []string
}
Run Code Online (Sandbox Code Playgroud)

突然之间,即使使用类型断言,echo_back的输出也不会评估为与输入相同.我得到'恐慌:运行时错误:比较无法比较的类型YummyFood'

问题是为什么添加[]字符串类型会导致输入和输出无法比较?如何修改output_tiger以取回我放入的相同内容(即我希望它与'tiger'相同).我如何反映output_tiger使它等于老虎?

Ask*_*sen 10

它不会很快,但您可以使用reflect.DeepEqual()来比较切片(或只是YummyFood).它完成循环来比较所有元素的工作.你可能会做一个更有效的功能,但是如果那个有足够快的那么你将节省一些工作,也许一些错误.:-)


Ran*_*ku' 9

Slices([]string)没有定义相等.包含定义相等的成员的数组和结构将定义相等.

请注意,切片的相等性仍未定义,因此计算通常是不可行的.另请注意,结构和数组仍未定义有序比较运算符(<< => =).

来自http://golang.org/doc/go1.html#equality

  • 是什么让 Go 切片与其他语言中的无数其他具有相等运算符的动态数组不同?C++ STL 容器具有相等运算符、Java、JS,不胜枚举。我只是很好奇为什么 Go 的设计者选择不解决一个看起来很容易解决的问题。 (4认同)