Приведи примеры способов написания обобщенного кода

«Приведи примеры способов написания обобщенного кода» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go нет дженериков в классическом понимании, но есть несколько подходов для обобщенного кода:

  1. Интерфейсы - самый распространенный способ:
type Stringer interface {
    String() string
}

func Print(s Stringer) {
    fmt.Println(s.String())
}
  1. Пустые интерфейсы (interface{}) + type assertion:
func Print(v interface{}) {
    switch x := v.(type) {
    case int:
        fmt.Println(x * 2)
    case string:
        fmt.Println(x + "!")
    }
}
  1. 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
}
  1. Code generation (через go:generate):
//go:generate go run gen.go

Выбор зависит от версии Go и конкретной задачи. Generics - наиболее типобезопасный вариант в новых версиях.