【问题标题】:Uncomparable type error when []string field used (Go lang)使用 []string 字段时出现无法比较的类型错误(Go lang)
【发布时间】:2013-04-09 12:55:49
【问题描述】:

我有一个特定的 Go 语言结构对象,我正在与之交互,我希望它与自身相同。我将函数传递给一个简单地返回它的函数,但它通过接受 interface{} 输入/输出来实现

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”

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

【问题讨论】:

    标签: go


    【解决方案1】:

    它不会很快,但您可以使用reflect.DeepEqual() 来比较切片(或只是 YummyFood)。它的工作是循环遍历它以比较所有元素。您可能可以创建一个更有效的功能来执行此操作,但如果那里的功能足够快,您将为自己节省一些工作,也许还有一些错误。 :-)

    【讨论】:

      【解决方案2】:

      切片 ([]string) 没有定义相等性。包含定义了相等的成员的数组和结构将定义相等。

      请注意,对于切片而言,相等性仍未定义,通常无法对其进行计算。另请注意,对于结构体和数组,有序比较运算符 ( >=) 仍未定义。

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

      【讨论】:

      • 是什么让 Go 切片与其他语言中存在相等运算符的无数其他动态数组不同? C++ STL 容器有相等运算符、Java、JS,不胜枚举。我只是很好奇为什么 Go 设计者选择不解决一个似乎非常可以解决的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多