Объявление типа type

Объявление типа type в Go позволяет создавать пользовательские типы данных на основе существующих типов. Это мощный механизм для улучшения читаемости кода и добавления специфического поведения. Новый тип наследует структуру базового типа, но считается отдельным типом, что предотвращает неявное преобразование. В качестве базового могут выступать встроенные типы, структуры, интерфейсы или даже другие пользовательские типы.

Синтаксис

gotype NewType BaseType

Где NewType - имя нового типа, BaseType - существующий тип, на основе которого создается новый тип.

Пример с базовым типом

Создадим тип MyString на основе string и используем его в программе:

gopackage main

import "fmt"

type MyString string

func main() {
  var s MyString = "Hello, Go"
  fmt.Println(s)
}

Результат выполнения кода:

go"Hello, Go"

Здесь тип MyString объявлен на основе string. Переменная s имеет тип MyString и не может быть напрямую присвоена строке без явного преобразования.

Пример с методом

Создадим тип Counter на основе int и добавим ему метод для увеличения значения:

gopackage main

import "fmt"

type Counter int

func (c *Counter) Increment() {
  *c++
}

func main() {
  var c Counter = 5
  c.Increment()
  fmt.Println(c)
}

Результат выполнения кода:

go6

Метод Increment привязан к типу Counter и может изменять его значение.

Пример со структурой

Объявим структуру Person и создадим новый тип Employee на её основе:

gopackage main

import "fmt"

type Person struct {
  Name string
  Age  int
}

type Employee Person

func main() {
  var e Employee = Employee{Name: "Alice", Age: 30}
  fmt.Println(e)
}

Результат выполнения кода:

go{Alice 30}

Тип Employee является отдельным типом, но имеет ту же структуру, что и Person.

Пример с интерфейсом

Создадим новый тип Stringer на основе интерфейса fmt.Stringer:

gopackage main

import "fmt"

type Stringer fmt.Stringer

type MyInt int

func (m MyInt) String() string {
  return fmt.Sprintf("value: %d", m)
}

func main() {
  var s Stringer = MyInt(42)
  fmt.Println(s.String())
}

Результат выполнения кода:

go"value: 42"

Тип Stringer является псевдонимом для интерфейса fmt.Stringer и может содержать любой тип, реализующий метод String.

Смотрите также

  • объявление переменных var,
    которое позволяет создавать именованные переменные
  • константы const,
    которые определяют неизменяемые значения
  • функции func,
    которые определяют блоки кода с параметрами и возвратом
  • пакеты package,
    которые организуют код в модули и пространства имен