Проверка равенства интерфейса {}
Я ищу срез []interface{}
для заданного значения interface{}
:
var v interface{}
for i := 0; i < len(A); i++ {
if (A[i] == v) {
fmt.Println("Gotcha!")
break
}
}
В тривиальном случае типы int
. Однако что мне делать, если, например, типы являются обычными struct
?
Ответы
Ответ 1
Благодаря комментарию @CodingPickle, я предоставляю следующее из спецификации языка программирования Go
Операторы равенства == и! = Применяются к операндам, которые сравнимы.
Относительно interface{}
и structs
:
- Значения интерфейса сопоставимы. Два значения интерфейса равны, если они имеют идентичные динамические типы и одинаковые динамические значения или оба имеют значение nil.
- Значение x неинтерфейсного типа X и значение t интерфейсного типа T сравнимы, когда значения типа X сравнимы и X реализует T. Они равны, если динамический тип t идентичен X, а динамическое значение t равно x,
- Значения структур сравнимы, если все их поля сопоставимы. Два значения структуры равны, если их соответствующие непустые поля равны.
Вы также можете попробовать эту игровую площадку https://play.golang.org/p/bgO1_V87v9k
Другими словами, обработка равенства кажется легкой в Go!
Ответ 2
Обновление: с момента написания вышеуказанного вопроса и ответов язык Go несколько изменился.
Ранее, если два интерфейса сравнивались и один или оба содержали несопоставимый тип, тогда время выполнения вызывало бы панику. Теперь среда выполнения будет только паниковать, если они оба будут содержать один и тот же несопоставимый тип. (Если они содержат разные типы, тогда результат будет ложным, даже если какой-либо тип несопоставим.)
Что такое несопоставимые типы? По сути, это срезы, карты, функции и любые типы структур или массивов, которые их используют.
AFAIK, это было тихое изменение вокруг Go 1.9 или 1.10.