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