Типы в пакете builtin

Описание типов из пакета 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. Неявная реализация - все сопоставимые типы автоматически удовлетворяют этому интерфейсу
  2. Ограниченное использование - может применяться только как ограничение типа в дженериках
  3. Строгая типизация - гарантирует, что типы можно сравнивать между собой

Пример 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{}))
}

Практическое применение:

  1. Создание универсальных контейнеров
  2. Реализация алгоритмов для разных типов
  3. Написание тестовых утилит
  4. Создание библиотечных функций

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 — это целочисленный тип, который достаточно велик, чтобы содержать битовую матрицу любого указателя.