Найти в Дзене

🐹✨ Go становится проще: зачем язык избавляется от «core types» и почему это важно

Язык Go всегда отличался простотой и лаконичностью. Его сила — в прозрачности и ясности кода. Однако, с появлением дженериков (generics) в версии Go 1.18, возникла концепция, которая многим усложнила жизнь — так называемые «core types» (основные типы). Недавно стало известно, что разработчики Go решили убрать это понятие из языка, и это отличная новость. Разберёмся, почему. 🔍 Что такое «core types» и зачем они были нужны? Когда Go получил поддержку дженериков, появилась необходимость обобщить операции, чтобы они работали с целыми группами типов (type sets). Для упрощения логики и реализации компилятора ввели концепцию core types: Идея была неплохой, но на практике это усложнило как чтение спецификации языка, так и понимание кода. ❌ Какие проблемы вызвали «core types»? Концепция выглядела логично в теории, но принесла сложности на практике: 🧹 Как это исправили в Go 1.25? Разработчики Go решили полностью удалить понятие core types, заменив его чёткими и конкретными правилами для каждой

Язык Go всегда отличался простотой и лаконичностью. Его сила — в прозрачности и ясности кода. Однако, с появлением дженериков (generics) в версии Go 1.18, возникла концепция, которая многим усложнила жизнь — так называемые «core types» (основные типы). Недавно стало известно, что разработчики Go решили убрать это понятие из языка, и это отличная новость. Разберёмся, почему.

🔍 Что такое «core types» и зачем они были нужны?

Когда Go получил поддержку дженериков, появилась необходимость обобщить операции, чтобы они работали с целыми группами типов (type sets). Для упрощения логики и реализации компилятора ввели концепцию core types:

  • 🔹 Если тип не является дженериком, его core type — это просто его базовый тип.
  • 🔸 Если тип — это параметр типа (дженерик), core type — это общий базовый тип для всех допустимых значений, которые могут его реализовать.

Идея была неплохой, но на практике это усложнило как чтение спецификации языка, так и понимание кода.

Какие проблемы вызвали «core types»?

Концепция выглядела логично в теории, но принесла сложности на практике:

  • 📚 Усложнение документации:
    Чтобы понять простые операции, такие как закрытие канала (close), нужно было предварительно разобраться с core types. Это увеличивало порог входа в язык, особенно для новичков.
  • 🌀 Неудобные ограничения:
    Например, операции со срезами (slices) стали сложнее — спецификация излишне усложнялась, что ограничивало гибкость использования.
  • ⚠️ Сложность компилятора:
    Вместо простых и понятных сообщений об ошибках, компилятор начал выдавать загадочные предупреждения с упоминанием core types, что путало пользователей.

🧹 Как это исправили в Go 1.25?

Разработчики Go решили полностью удалить понятие core types, заменив его чёткими и конкретными правилами для каждой отдельной операции. Вот главные плюсы такого подхода:

  • 📖 Упрощение спецификации языка:
    Теперь каждая операция (индексация, отправка в канал, закрытие канала) описана простыми, понятными словами, без ссылок на абстрактные конструкции.
  • 🎯 Ясность и точность сообщений об ошибках:
    Компилятор стал конкретнее, указывая на конкретные проблемы и их причины, а не на расплывчатые «core types».
  • 🚪 Гибкость и расширяемость языка в будущем:
    Уход от абстрактных понятий позволяет в будущем легко добавлять новые функции и улучшать старые, не усложняя язык.

⚙️ Технические детали: пример того, что изменилось

Вот конкретный пример из спецификации Go, показывающий, как изменилась документация для функции close:

🔸 До (с Go 1.18 по Go 1.24):

Для аргумента ch с core type, который является каналом, встроенная функция close записывает, что в этот канал больше не будут отправляться значения.

🔹 После (начиная с Go 1.25):

Для канала ch встроенная функция close(ch) записывает, что в канал больше не будут отправляться значения.

Сразу видна простота и ясность, без необходимости изучать предварительно дополнительный концепт.

💬 Мнение автора статьи

Я считаю, что это прекрасный пример того, как язык может развиваться правильно — удаляя избыточные абстракции и упрощая жизнь разработчикам. Go всегда славился своим прагматизмом, и решение убрать core types это доказывает.

Для сообщества это большой плюс:

  • 🧑‍💻 Новички смогут быстрее входить в Go, не ломая голову над сложными терминами.
  • 🎓 Преподаватели смогут проще объяснять основы языка студентам.
  • 🔧 Опытные разработчики получат более конкретные и полезные сообщения компилятора.

Именно такие изменения, на мой взгляд, делают Go уникальным языком, который заботится не только о технологических аспектах, но и о простоте понимания и комфорте разработчика.

🚀 Что ждать от Go в будущем?

Думаю, в ближайшие годы мы увидим больше подобных изменений — минимализм и простота станут ещё более выраженными. При этом язык будет становиться всё более мощным и гибким. Развитие дженериков продолжится, но уже без ненужной сложности.

Ведь главная сила Go — это не только скорость и эффективность, но и невероятно комфортный для программиста дизайн.

🔗 Полезные ссылки и источники: