Go · 62 строк
По координатам пользователя и радиусу в метрах обработчик ищет организации нужной категории и отдаёт их от ближней к дальней. Сначала базе отдаётся прямоугольник вокруг точки, затем расстояние уточняется формулой гаверсинуса.
В таблице places 2,4 млн организаций по России, индекс по (category, lat, lon). Приложение шлёт радиус 1 000 м, но параметр открыт в публичном API. Отметьте строки с ошибками.
В работе: Запрос «аптеки рядом» в поиске Карт: ответ нужен за 100 мс.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных Яндекс Карт: поиск организаций рядом. Условие пересказано своими словами.
Давали на собеседовании?
package geosearchimport ("database/sql""encoding/json""fmt""math""net/http""sort""strconv")type Place struct {ID int64 `json:"id"`Name string `json:"name"`Lat float64 `json:"lat"`Lon float64 `json:"lon"`Distance float64 `json:"distance_m"`}const earthRadiusM = 6371000.0func haversine(lat1, lon1, lat2, lon2 float64) float64 {dLat := lat2 - lat1dLon := lon2 - lon1a := math.Sin(dLat/2)*math.Sin(dLat/2) +math.Cos(lat1)*math.Cos(lat2)*math.Sin(dLon/2)*math.Sin(dLon/2)return 2 * earthRadiusM * math.Asin(math.Sqrt(a))}func Nearby(db *sql.DB) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {q := r.URL.Query()lat, _ := strconv.ParseFloat(q.Get("lat"), 64)lon, _ := strconv.ParseFloat(q.Get("lon"), 64)radius, _ := strconv.ParseFloat(q.Get("radius"), 64)category := q.Get("category")dLat := radius / 111000dLon := radius / 111000query := fmt.Sprintf("SELECT id, name, lat, lon FROM places WHERE category = '%s' "+"AND lat BETWEEN %f AND %f AND lon BETWEEN %f AND %f",category, lat-dLat, lat+dLat, lon-dLon, lon+dLon)rows, err := db.Query(query)if err != nil {http.Error(w, "db error", http.StatusInternalServerError)return}var result []Placefor rows.Next() {var p Placeif err := rows.Scan(&p.ID, &p.Name, &p.Lat, &p.Lon); err != nil {continue}p.Distance = haversine(lat, lon, p.Lat, p.Lon)result = append(result, p)}sort.Slice(result, func(i, j int) bool { return result[i].Distance < result[j].Distance })json.NewEncoder(w).Encode(result)}}