2013-04-09 2 views
9

У меня есть определенный объект структуры Go lang, с которым я взаимодействую, и я ожидаю, что он будет равен самому себе. Я передаю функцию в функцию, которая просто возвращает его, но что делает это, принимая интерфейс {} входы/выходыНесравненная ошибка типа, когда [] используется поле string (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)) 

} 

Запуск этого, вы видите, что тигр и output_tiger кажутся одинаковыми и оценить, быть равным. Отлично. Этого я и ожидал. ТЕПЕРЬ, попробуйте использовать это определение для YummyFood

type YummyFood { 
    calories int 
    ingredients []string 
} 

Внезапно, выход из echo_back не оценивает, чтобы быть таким же, как на входе, даже с типом утверждения. Я получаю «панику: ошибка времени выполнения: сравнение несравнимого типа YummyFood»

Вопрос в том, почему добавление строкового типа [] приводит к несравнимости ввода и вывода? Как я могу изменить output_tiger, чтобы вернуть ту же самую вещь, которую я положил (я ожидаю, что она будет такой же, как «тигр»). Как отразить output_tiger, чтобы он был равен тигру?

ответ

8

Ломтики ([]string) не имеют определенного равенства. Массивы и структуры, содержащие членов, имеющих определенное равенство, будут иметь определенное равенство.

Note that equality is still undefined for slices, for which the calculation is in general infeasible. Also note that the ordered comparison operators (< <= > >=) are still undefined for structs and arrays.

От http://golang.org/doc/go1.html#equality

+0

Что делает фрагменты Go отличными от множества других динамических массивов на других языках, для которых существуют операторы равенства? Контейнеры C++ STL имеют операторы равенства, Java, JS, этот список можно продолжить. Мне просто интересно, почему дизайнеры Go решили не решать проблему, которая кажется чрезвычайно разрешимой. – iamtheddrman

8

Это не будет быстрым, но вы можете использовать reflect.DeepEqual() сравнить ломтики (или просто YummyFood). Он выполняет эту работу, чтобы прокрутить ее, чтобы сравнить все элементы. Вероятно, вы могли бы сделать более эффективную функцию, но если тот, который существует, достаточно быстро, вы сэкономите немного работы и, возможно, некоторые ошибки. :-)

Смежные вопросы