Информация об изменениях

Сообщение В GoLang, таки, добавили generic'и от 16.03.2022 11:45

Изменено 16.03.2022 12:56 Reset

Они, таки, добавили туда generic'и
Go 1.18 теперь тоже умеет обобщенные типы (generic, C++ templates) как для функций, так и для типов.

https://www.opennet.ru/opennews/art.shtml?num=56864

В новой версии добавлена поддержка обобщённых функций и типов (дженериков), при помощи которых разработчик может определить и использовать функции, предназначенные для работы сразу с несколькими типами. Также предоставлена возможность использования интерфейсов для создания комбинированных типов, охватывающих несколько типов данных. Поддержка дженериков реализована без нарушения обратной совместимости с существующим кодом.



// Суммирование значений набора, работающее для типов int64 и float64
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V { 
    var s V
    for _, v := range m {
        s += v
    }
    return s
}

// Другой вариант с обобщённым определением типа:

type Number interface {
   int64 | float64
}
func SumNumbers[K comparable, V Number](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}


Так они скоро и Rust догонят.
В GoLang, таки, добавили generic'и
Go 1.18 теперь тоже умеет обобщенные типы (generic, C++ templates) как для функций, так и для типов.

https://www.opennet.ru/opennews/art.shtml?num=56864

В новой версии добавлена поддержка обобщённых функций и типов (дженериков), при помощи которых разработчик может определить и использовать функции, предназначенные для работы сразу с несколькими типами. Также предоставлена возможность использования интерфейсов для создания комбинированных типов, охватывающих несколько типов данных. Поддержка дженериков реализована без нарушения обратной совместимости с существующим кодом.



// Суммирование значений набора, работающее для типов int64 и float64
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V { 
    var s V
    for _, v := range m {
        s += v
    }
    return s
}

// Другой вариант с обобщённым определением типа:

type Number interface {
   int64 | float64
}
func SumNumbers[K comparable, V Number](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}


Так они скоро и Rust догонят.