TGViewer
dev notes dev notes @junsenior · 1.39K subscribers
Post #332 1.02K
Тут две недели назад приняли пропозал в Go от Robert Griesemer - это, на минуточку, один из создателей языка.

Пропозал добавляет возможность объявлять типы-параметры у дженерик-методов, а не только у структур и обычных функций.

На простом примере: допустим, есть у нас структура ответа c дженерик-типом:

type Response[T any] struct {
Data T
Err error
}


И получая ответ для типа User, мы хотим его замапить в другой тип - UserDTO. Если ты не знаком с дженериками, то интуитивно хочется сделать что-то такое:

func (Response[T]) Map[U any] funcname...


Но так сделать нельзя. Сейчас Go позволяет на структуру навешивать методы только с тем типом, который определен для структуры. Чтобы решить проблему с маппером выше сейчас нужно определять глобальную функцию:

func MapResponse[T any, U any](r Response[T], f func(T) U) Response[U] {
if r.Err != nil {
return Response[U]{Err: r.Err}
}
return Response[U]{Data: f(r.Data)}
}

и вызывать ее потом следующим образом:

resp := GetUserFromDB(1)
dtoResp := MapResponse(resp, func(u User) UserDTO {
return UserDTO{Name: u.Name}
})


Когда пропозал завезут в новую версию, дженерик-структуры получат возможность навешивать методы с собственными параметрами:

type Response[T any] struct {
Data T
Err error
}

func (r Response[T]) Map[U any](f func(T) U) Response[U] {
if r.Err != nil {
return Response[U]{Err: r.Err}
}
return Response[U]{Data: f(r.Data)}
}

// использование:
dtoResp := GetUserFromDB(1).Map(func(u User) UserDTO {
return UserDTO{Name: u.Name}
})


Куда это красиво ляжет? Например, на обработку коллекций или потоков данных. Можно будет использовать цепочку вызовов:

mySlice.Map(transform).Filter(check).Collect()


В целом, после первичной стадии отторжения дженериков пару лет назад - я плавно перешел в стадию их принятия, особенно когда на работе появился проект, где мы их начали использовать. Сейчас же, когда их использование стало совсем привычной вещью - этот пропозал выглядит очень полезным и явно двигает систему дженериков в Go в нужную сторону.
GitHub spec: generic methods for Go · Issue #77273 · golang/go Proposal: Generic Methods for Go A change of view. Background For clarity, in the following we use the term concrete method (or just method when the context is clear) to describe a non-interface me...
  • 👍 8
  • 🔥 6
More from @junsenior
  1. Sep 28, 2026Сошлись две вещи. Первая - мой проект safemap.ai, про который я уже писал выше - интеракти…
  2. Sep 17, 2026Post #356
  3. Sep 15, 2026Увидел тут в x.com статистику вакансий по PHP и статистику вакансий по hh.ru в целом. Я на…
  4. Sep 12, 2026Вдохновившись проектом, где делали интерактивную карту с тем, как работает Postgres (писал…
  5. Sep 8, 2026OpenAI выложили блогпост https://openai.com/index/navier-stokes-solution/ Мы публикуем реш…
  6. Sep 8, 2026Если кто не знал, вокруг этого сейчас разгорается очень большой скандал с OpenAI. Кратко,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →