Вопрос: Как сделать читабельный пример с интерфейсом, 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.