четверг, 30 мая 2019 г.

Спецификация Go: свойства типов и значений - идентичность типа (Type identity)

Два типа могут быть либо идентичны, либо различны.

Определенный тип (defined type) всегда отличается от любого другого типа. В противном случае два типа идентичны, если литералы их базовых типов структурно эквивалентны; то есть они имеют одинаковую буквальную структуру, а соответствующие компоненты имеют идентичные типы. В деталях:

  • Два типа массива (array types) идентичны, если они имеют идентичные типы элементов и одинаковую длину массива.
  • Два типа срезов (slice types) идентичны, если они имеют идентичные типы элементов.
  • Два типа структуры (struct types) идентичны, если они имеют одинаковую последовательность полей и если соответствующие поля имеют одинаковые имена, идентичные типы и идентичные теги. Не экспортированные имена полей из разных пакетов всегда различны.
  • Два типа указателей идентичны, если они имеют идентичные базовые типы.
  • Два типа функций идентичны, если они имеют одинаковое количество параметров и значений результатов, соответствующие параметры и типы результатов идентичны, и либо обе функции являются переменными, либо ни одна из них не является. Имена параметров и результатов не обязательно должны совпадать.
  • Два типа интерфейса идентичны, если они имеют одинаковый набор методов с одинаковыми именами и одинаковыми типами функций. Не экспортированные имена методов из разных пакетов всегда различны. Порядок методов не имеет значения.
  • Два типа карт идентичны, если они имеют идентичные ключи и типы элементов.
  • Два типа каналов идентичны, если они имеют идентичные типы элементов и одинаковое направление.

Далее приведены декларации

type (
  A0 = []string
  A1 = A0
  A2 = struct{ a, b int }
  A3 = int
  A4 = func(A3, float64) *A0
  A5 = func(x int, _ float64) *[]string
)

type (
  B0 A0
  B1 []string
  B2 struct{ a, b int }
  B3 struct{ a, c int }
  B4 func(int, float64) *B0
  B5 func(x int, y float64) *A1
)

type  C0 = B0

Эти типы идентичны:

A0, A1, и []string
A2 и struct{ a, b int }
A3 и int
A4, func(int, float64) *[]string, и A5

B0 и C0
[]int и []int
struct{ a, b *T5 } и struct{ a, b *T5 }
func(x int, y float64) *[]string, func(int, float64) (result *[]string), и A5

B0 и B1 различны, потому что они являются новыми типами, созданными различными определениями типов; func(int, float64) *B0 и func(x int, y float64) *[]string отличаются тем, что B0 отличается от []string.


Читайте также:


Комментариев нет:

Отправить комментарий