package main
import (
"context"
"fmt"
"sync"
"time"
)
type Server struct {
addr string
mu sync.RWMutex
requests int
}
func (s *Server) HandleRequest(ctx context.Context, request string) (string, error) {
select {
case <-ctx.Done():
return "", ctx.Err()
default:
s.mu.Lock()
s.requests++
s.mu.Unlock()
time.Sleep(100 * time.Millisecond)
return fmt.Sprintf("Processed: %s", request), nil
}
}
type Handler interface {
HandleRequest(ctx context.Context, request string) (string, error)
}
func Map[T any, U any](items []T, f func(T) U) []U {
result := make([]U, len(items))
for i, item := range items {
result[i] = f(item)
}
return result
}
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for job := range jobs {
fmt.Printf("Worker %d processing job %d\n", id, job)
results <- job * 2
}
}
func main() {
var h Handler = &Server{addr: "localhost:8080"}
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
result, err := h.HandleRequest(ctx, "hello")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result)
numbers := []int{1, 2, 3, 4, 5}
doubled := Map(numbers, func(n int) int { return n * 2 })
fmt.Println(doubled)
const numWorkers = 3
const numJobs = 10
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
var wg sync.WaitGroup
for w := 1; w <= numWorkers; w++ {
wg.Add(1)
go worker(w, jobs, results, &wg)
}
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
wg.Wait()
close(results)
for result := range results {
fmt.Println("Result:", result)
}
}