Типы в пакете builtin
type ComplexType
type ComplexType complex64
ComplexType используется здесь исключительно в целях документирования. Он заменяет любой из типов complex: complex64 или complex128.
type FloatType
type FloatType float32
FloatType используется здесь исключительно в целях документирования. Он заменяет любой из типов float: float32 или float64.
type IntegerType
type IntegerType int
IntegerType используется здесь только в целях документирования. Он заменяет любой тип целого числа: int, uint, int8 и т. д.
type Type
type Type int
Type используется здесь только в целях документирования. Он заменяет любой тип Go, но представляет один и тот же тип для любого вызова функции.
type Type1
type Type1 int
Type1 используется здесь только в целях документирования. Он является заменителем для любого типа Go, но представляет один и тот же тип для любого вызова функции.
type any
type any = interface{}
any является псевдонимом для interface{} и во всех отношениях эквивалентен interface{}.
type bool
type bool bool
bool — это набор булевых значений true и false.
type byte
type byte = uint8
byte — это псевдоним для uint8 и во всех отношениях эквивалентен uint8. По соглашению он используется для отличия значений byte от 8-битных целых чисел без знака.
type comparable
type comparable interface{ comparable }
comparable
— это интерфейс, который реализуется всеми сопоставимыми типами (булевыми значениями, числами, строками, указателями, каналами, массивами сопоставимых типов, структурами, все поля которых являются сопоставимыми типами). Интерфейс comparable
может использоваться только в качестве ограничения параметра типа, а не в качестве типа переменной.
Подробнее
Интерфейс comparable
- это специальный встроенный интерфейс в Go, который представляет все типы, поддерживающие операции сравнения ==
и !=
. Он используется исключительно как ограничение (constraint) для параметров типа в дженериках.
Особенности comparable
:
- Неявная реализация - все сопоставимые типы автоматически удовлетворяют этому интерфейсу
- Ограниченное использование - может применяться только как ограничение типа в дженериках
- Строгая типизация - гарантирует, что типы можно сравнивать между собой
Пример 1: Простая функция сравнения
package main
import "fmt"
// Equal проверяет равенство двух значений comparable типа
func Equal[T comparable](a, b T) bool {
return a == b
}
func main() {
fmt.Println(Equal(1, 1)) // true
fmt.Println(Equal("a", "b")) // false
fmt.Println(Equal(true, false)) // false
}
Пример 2: Проверка наличия элемента в слайсе
func Contains[T comparable](slice []T, item T) bool {
for _, v := range slice {
if v == item {
return true
}
}
return false
}
func main() {
nums := []int{1, 2, 3}
fmt.Println(Contains(nums, 2)) // true
fmt.Println(Contains(nums, 5)) // false
strs := []string{"a", "b", "c"}
fmt.Println(Contains(strs, "b")) // true
}
Пример 3: Уникальные элементы в слайсе
func Unique[T comparable](slice []T) []T {
seen := make(map[T]bool)
result := []T{}
for _, v := range slice {
if !seen[v] {
seen[v] = true
result = append(result, v)
}
}
return result
}
func main() {
dupes := []int{1, 2, 2, 3, 4, 4, 5}
fmt.Println(Unique(dupes)) // [1 2 3 4 5]
}
Какие типы являются comparable
:
- Базовые типы:
bool
,int
,float64
,string
и т.д. - Указатели (
*T
) - Каналы (
chan T
) - Массивы, если их элементы comparable (
[3]int
,[2]string
) - Структуры, если все их поля comparable
Какие типы НЕ являются comparable
:
- Слайсы (
[]T
) - Мапы (
map[K]V
) - Функции
- Структуры, содержащие несопоставимые поля
Пример 4: Ошибка при использовании несопоставимого типа
func main() {
// Ошибка: slice does not satisfy comparable
fmt.Println(Equal([]int{1}, []int{1}))
// Ошибка: map does not satisfy comparable
fmt.Println(Equal(map[int]int{}, map[int]int{}))
}
Практическое применение:
- Создание универсальных контейнеров
- Реализация алгоритмов для разных типов
- Написание тестовых утилит
- Создание библиотечных функций
type complex128
type complex128 complex128
complex128 — это набор всех комплексных чисел с вещественными и мнимыми частями float64.
type complex64
type complex64 complex64
complex64 — это набор всех комплексных чисел с вещественными и мнимыми частями типа float32.
type error
type error интерфейс {
Error() string
}
Встроенный интерфейсный тип error — это стандартный интерфейс для представления условия ошибки, причем значение nil означает отсутствие ошибки.
type float32
type float32 float32
float32 — это набор всех 32-разрядных чисел с плавающей запятой IEEE 754.
type float64
type float64 float64
float64 — это набор всех 64-разрядных чисел с плавающей запятой IEEE 754.
type int
type int int
int — это тип целых чисел с знаком, размер которого составляет не менее 32 бит. Однако это отдельный тип, а не псевдоним, например, int32.
type int16
type int16 int16
int16 — это набор всех 16-разрядных целых чисел со знаком. Диапазон: от -32768 до 32767.
type int32
type int32 int32
int32 — это набор всех 32-разрядных целых чисел со знаком. Диапазон: от -2147483648 до 2147483647.
type int64
type int64 int64
int64 — это набор всех 64-разрядных целых чисел со знаком. Диапазон: от -9223372036854775808 до 9223372036854775807.
type int8
type int8 int8
int8 — это набор всех 8-битных целых чисел со знаком. Диапазон: от -128 до 127.
type rune
type rune = int32
rune — это псевдоним для int32 и во всех отношениях эквивалентен int32. По соглашению он используется для отличия значений символов от целочисленных значений.
type string
type string string
string — это набор всех строк из 8-битных байтов, которые по соглашению, но не обязательно, представляют текст, закодированный в UTF-8. Строка может быть пустой, но не может быть nil. Значения типа string являются неизменяемыми.
type uint
type uint uint
uint — это тип целого числа без знака, размер которого составляет не менее 32 бит. Однако это отдельный тип, а не псевдоним, например, для uint32.
type uint16
type uint16 uint16
uint16 — это набор всех 16-битных целых чисел без знака. Диапазон: от 0 до 65535.
type uint32
type uint32 uint32
uint32 — это набор всех 32-битных целых чисел без знака. Диапазон: от 0 до 4294967295.
type uint64
type uint64 uint64
uint64 — это набор всех 64-разрядных целых чисел без знака. Диапазон: от 0 до 18446744073709551615.
type uint8
type uint8 uint8
uint8 — это набор всех 8-разрядных целых чисел без знака. Диапазон: от 0 до 255.
type uintptr
type uintptr uintptr
uintptr — это целочисленный тип, который достаточно велик, чтобы содержать битовую матрицу любого указателя.