Одновременность интерфейса/реализации в Golang Generics
Рассмотрим задачу создания универсальной функции для заполнения среза инициализированными значениями. Хотя это может показаться простым, возникают проблемы при попытке использовать фрагменты интерфейсов и указать конкретные типы внутри функции.
В Go 1.18 ограничение X и Y как любых типов в общей функции Fill приводит к потере любых отношений между интерфейсом и его разработчиками. Это предотвращает присвоение экземпляров Y срезу[i] внутри функции.
Чтобы обойти это, можно использовать явное утверждение:
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
Однако этот подход вызывает панику, когда Y не реализует X. Кроме того, использование типа указателя для Y приводит к потере информации о базовом типе и нулевом базовом значении.
To Чтобы решить эти проблемы, рекомендуется использовать функцию-конструктор вместо параметра второго типа:
func main() {
xs := make([]sync.Locker, 10)
Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}
func Fill[X any](slice []X, f func() X) {
for i := range slice {
slice[i] = f()
}
}
Этот подход эффективно заполняет срез инициализированными значениями, созданными функцией-конструктором, обеспечивая более надежное и гибкое решение проблемы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3