Вопрос: Как сделать читабельный пример с интерфейсом, embedding, generics и конкурентностью вместе (

Go Junior Без компании
Вопрос: Как сделать читабельный пример с интерфейсом, embedding, generics и конкурентностью вместе (мини-реалистичный кейс)?
Ответы
Кейс: есть хранилище, которое логирует, обрабатывает элементы конкурентно и возвращает результат. ```go package main import ( "fmt" "sync" ) type Logger struct{} func (Logger) Log(msg string) { fmt.Println("LOG:", msg) } type Store[T any] interface { Put(T) All() []T } type MemStore[T any] struct { Logger mu sync.Mutex xs []T } func (s *MemStore[T]) Put(v T) { s.mu.Lock() s.xs = append(s.xs, v) s.mu.Unlock() s.Log("put") } func (s *MemStore[T]) All() []T { s.mu.Lock() defer s.mu.Unlock() out := make([]T, len(s.xs)) copy(out, s.xs) return out } func ParallelMap[T any, R any](in []T, f func(T) R) []R { out := make([]R, len(in)) var wg sync.WaitGroup wg.Add(len(in)) for i := range in { i := i go func() { defer wg.Done() out[i] = f(in[i]) }() } wg.Wait() return out } func main() { var s MemStore[int] for _, v := range []int{1, 2, 3, 4} { s.Put(v) } squares := ParallelMap(s.All(), func(x int) int { return x * x }) fmt.Println(squares) } ``` Здесь: embedding (Logger), интерфейс Store[T], generic тип MemStore[T], sync.Mutex, goroutines + WaitGroup, generics в ParallelMap.