context.Background() вместо r.Context() в хендлере
Код-ревьюMiddle20 минпроверка — Спринт23-t008
Проведите ревью и рефакторинг небольшого сервиса каталога: эндпоинт GET /products?category=...&sort=... возвращает товары категории из PostgreSQL. Найдите все проблемы — от корректности и безопасности до структуры кода и эксплуатации — и предложите исправленную версию.
Как на собесе: 20 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.
review.gogo
1packagemain23import(4"context"5"database/sql"6"encoding/json"7"fmt"8"net/http"9"time"10)1112vardb*sql.DB1314typeProductstruct{15IDint64`json:"id"`16Namestring`json:"name"`17Categorystring`json:"category"`18Priceint64`json:"price"`19}2021funcproductsHandler(whttp.ResponseWriter,r*http.Request){22ctx:=context.Background()23ctx,_=context.WithTimeout(ctx,5*time.Second)2425category:=r.URL.Query().Get("category")26sort:=r.URL.Query().Get("sort")2728query:=fmt.Sprintf("SELECT id, name, category, price FROM products WHERE category = '%s' ORDER BY %s",category,sort)29rows,_:=db.QueryContext(ctx,query)3031varproducts[]Product32forrows.Next(){33varpProduct34rows.Scan(&p.ID,&p.Name,&p.Category,&p.Price)35products=append(products,p)36}3738json.NewEncoder(w).Encode(products)39}4041funcmain(){42db,_=sql.Open("postgres","postgres://shop:shop@localhost/shop?sslmode=disable")43http.HandleFunc("/products",productsHandler)44http.ListenAndServe(":8080",nil)45}