Два типа могут быть либо идентичны, либо различны.
Определенный тип (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.
Читайте также:
- Спецификация Go: типы (types)
- Спецификация Go: типы структур (struct types)
- Спецификация Go: тип интерфейса (interface type)
Комментариев нет:
Отправить комментарий