Объявление типа type
Объявление типа type в Go позволяет создавать
пользовательские типы данных на основе существующих
типов. Это мощный механизм для улучшения читаемости
кода и добавления специфического поведения. Новый тип
наследует структуру базового типа, но считается
отдельным типом, что предотвращает неявное
преобразование. В качестве базового могут выступать
встроенные типы, структуры, интерфейсы или даже другие
пользовательские типы.
Синтаксис
type NewType BaseType
Где NewType - имя нового типа,
BaseType - существующий тип, на основе которого
создается новый тип.
Пример с базовым типом
Создадим тип MyString на основе
string и используем его в программе:
package main
import "fmt"
type MyString string
func main() {
var s MyString = "Hello, Go"
fmt.Println(s)
}
Результат выполнения кода:
"Hello, Go"
Здесь тип MyString объявлен на основе
string. Переменная s имеет тип
MyString и не может быть напрямую присвоена
строке без явного преобразования.
Пример с методом
Создадим тип Counter на основе int
и добавим ему метод для увеличения значения:
package main
import "fmt"
type Counter int
func (c *Counter) Increment() {
*c++
}
func main() {
var c Counter = 5
c.Increment()
fmt.Println(c)
}
Результат выполнения кода:
6
Метод Increment привязан к типу
Counter и может изменять его значение.
Пример со структурой
Объявим структуру Person и создадим новый
тип Employee на её основе:
package 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)
}
Результат выполнения кода:
{Alice 30}
Тип Employee является отдельным типом,
но имеет ту же структуру, что и Person.
Пример с интерфейсом
Создадим новый тип Stringer на основе
интерфейса fmt.Stringer:
package 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())
}
Результат выполнения кода:
"value: 42"
Тип Stringer является псевдонимом для
интерфейса fmt.Stringer и может содержать
любой тип, реализующий метод String.