«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > **Как сохранить отношения интерфейс-реализатор при использовании дженериков в Go для инициализации срезов?**

**Как сохранить отношения интерфейс-реализатор при использовании дженериков в Go для инициализации срезов?**

Опубликовано 5 ноября 2024 г.
Просматривать:997

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Одновременность интерфейса/реализации в 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