Канал о разработке Антона Околелова. Разрабочик/ex-тимлид Go, живу в Чехии. Мысли, новости, вопросы.
По вопросам рекламы @antonokolelov
Post #361
3.18K
Дженерик алиасы типов в Go в 1.24 : что это и зачем они нужны
Представьте, что вы работаете над крупным проектом на Go, который развивается уже несколько лет. В какой-то момент вы понимаете, что структура пакетов, которую вы изначально выбрали, больше не отвечает потребностям проекта. Вам нужно перенести некоторые типы из одного пакета в другой. Звучит просто, верно? Но не тут-то было!
Проблема рефакторинга в больших проектах
Представим, что у вас есть популярный пакет oldpkg с типом User:
Теперь вы хотите перенести этот тип в новый пакет newpkg. Но ваш тип User используется в сотнях мест по всему проекту и в зависимых проектах. Как провести такой рефакторинг без боли?
Go 1.9 представил концепцию алиасов типов. Это позволяет нам создать новое имя для существующего типа без создания нового типа. Вот как это выглядит:
Теперь newpkg.User и oldpkg.User - это один и тот же тип. Мы можем постепенно обновлять использование oldpkg.User на newpkg.User по всему проекту, и компилятор будет счастлив.
Но что насчет дженериков?
С появлением дженериков в Go 1.18 возникла новая проблема. Как быть, если наш тип User использует параметры типа? До сих пор алиасы типов не поддерживали параметры типа. Но это изменится в Go 1.24
Дженерик алиасы типов
Представим, что наш тип User теперь дженерик:
В Go 1.24 мы сможем создать алиас для этого типа следующим образом:
Это позволяет нам сохранить полную совместимость типов при переносе дженерик-типов между пакетами.
Когда это будет доступно?
В Go 1.23 вы можете включить поддержку дженерик алиасов типов с помощью флага GOEXPERIMENT=aliastypeparams.
В Go 1.24 (ожидается в начале 2025 года) эта функция будет включена по умолчанию.
Подробности здесь
go.dev What's in an (Alias) Name? - The Go Programming Language A description of generic alias types, a planned feature for Go 1.24 Представьте, что вы работаете над крупным проектом на Go, который развивается уже несколько лет. В какой-то момент вы понимаете, что структура пакетов, которую вы изначально выбрали, больше не отвечает потребностям проекта. Вам нужно перенести некоторые типы из одного пакета в другой. Звучит просто, верно? Но не тут-то было!
Проблема рефакторинга в больших проектах
Представим, что у вас есть популярный пакет oldpkg с типом User:
package oldpkg
type User struct {
ID int
Name string
}
Теперь вы хотите перенести этот тип в новый пакет newpkg. Но ваш тип User используется в сотнях мест по всему проекту и в зависимых проектах. Как провести такой рефакторинг без боли?
Go 1.9 представил концепцию алиасов типов. Это позволяет нам создать новое имя для существующего типа без создания нового типа. Вот как это выглядит:
package newpkg
import "path/to/oldpkg"
type User = oldpkg.User
Теперь newpkg.User и oldpkg.User - это один и тот же тип. Мы можем постепенно обновлять использование oldpkg.User на newpkg.User по всему проекту, и компилятор будет счастлив.
Но что насчет дженериков?
С появлением дженериков в Go 1.18 возникла новая проблема. Как быть, если наш тип User использует параметры типа? До сих пор алиасы типов не поддерживали параметры типа. Но это изменится в Go 1.24
Дженерик алиасы типов
Представим, что наш тип User теперь дженерик:
package oldpkg
type User[T any] struct {
ID T
Name string
}
В Go 1.24 мы сможем создать алиас для этого типа следующим образом:
package newpkg
import "path/to/oldpkg"
type User[T any] = oldpkg.User[T]
Это позволяет нам сохранить полную совместимость типов при переносе дженерик-типов между пакетами.
Когда это будет доступно?
В Go 1.23 вы можете включить поддержку дженерик алиасов типов с помощью флага GOEXPERIMENT=aliastypeparams.
В Go 1.24 (ожидается в начале 2025 года) эта функция будет включена по умолчанию.
Подробности здесь
- 👍 11
- 🔥 5
- 😁 2
- 🙏 1
