Ответ
В Go нет дженериков в классическом понимании, но есть несколько подходов для обобщенного кода:
- Интерфейсы - самый распространенный способ:
type Stringer interface {
String() string
}
func Print(s Stringer) {
fmt.Println(s.String())
}
- Пустые интерфейсы (interface{}) + type assertion:
func Print(v interface{}) {
switch x := v.(type) {
case int:
fmt.Println(x * 2)
case string:
fmt.Println(x + "!")
}
}
- Generics (Go 1.18+):
func Map[T any](s []T, f func(T) T) []T {
r := make([]T, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}
- Code generation (через go:generate):
//go:generate go run gen.go
Выбор зависит от версии Go и конкретной задачи. Generics - наиболее типобезопасный вариант в новых версиях.