Проверка равенства интерфейса {}

Я ищу срез []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.