Ejemplos prácticos
Escenarios reales de parámetros de consulta (query)
1. Filtrado de productos en comercio electrónico
func filterProducts(query url.Values) []Product {
var products []Product
category := query.Get("category")
minPrice := query.Get("min_price")
maxPrice := query.Get("max_price")
// Apply dynamic filtering
for _, product := range allProducts {
if category != "" && product.Category != category {
continue
}
if minPrice != "" {
min, _ := strconv.Atoi(minPrice)
if product.Price < min {
continue
}
}
products = append(products, product)
}
return products
}
2. Paginación de solicitudes de API
graph LR
A[Query Parameters] --> B[Page Number]
A --> C[Results Per Page]
A --> D[Offset Calculation]
func getPaginatedResults(query url.Values) []Result {
page := query.Get("page")
limit := query.Get("limit")
pageNum, _ := strconv.Atoi(page)
resultsPerPage, _ := strconv.Atoi(limit)
if pageNum == 0 {
pageNum = 1
}
if resultsPerPage == 0 {
resultsPerPage = 10
}
offset := (pageNum - 1) * resultsPerPage
return fetchResults(offset, resultsPerPage)
}
Técnicas avanzadas de análisis (parsing) de consultas (query)
Manejo de consultas (query) complejas
| Escenario |
Ejemplo de consulta (query) |
Técnica de análisis (parsing) |
| Multi-selección |
?tags=golang&tags=web |
Manejo de múltiples valores |
| Parámetros anidados |
?filter[price]=50 |
Análisis (parsing) complejo |
| Marcas booleanas |
?active=true |
Conversión de tipos |
Ejemplo de búsqueda y filtrado
type SearchFilter struct {
Keyword string
Category string
MinPrice float64
MaxPrice float64
SortBy string
}
func parseSearchQuery(query url.Values) SearchFilter {
filter := SearchFilter{
Keyword: query.Get("q"),
Category: query.Get("category"),
MinPrice: parseFloat(query.Get("min_price")),
MaxPrice: parseFloat(query.Get("max_price")),
SortBy: query.Get("sort"),
}
return filter
}
func parseFloat(value string) float64 {
price, err := strconv.ParseFloat(value, 64)
if err != nil {
return 0
}
return price
}
Consideraciones de seguridad
Prevención de inyección de consultas (query)
func sanitizeQueryParams(query url.Values) url.Values {
sanitized := url.Values{}
for key, values := range query {
// Implement custom sanitization logic
sanitizedValues := []string{}
for _, value := range values {
cleanValue := sanitizeValue(value)
sanitizedValues = append(sanitizedValues, cleanValue)
}
sanitized[key] = sanitizedValues
}
return sanitized
}
Consejos de rendimiento
- Almacenar en caché las consultas (query) analizadas (parsed)
- Utilizar conversiones de tipos mínimas
- Validar la entrada temprano
- Implementar un filtrado eficiente
En LabEx, enfatizamos escribir código de análisis (parsing) de consultas (query) limpio y eficiente que equilibre la funcionalidad y el rendimiento.