es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Golang: El enrutador Gin con mapa solo está seleccionando un controlador.

Eres un traductor español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown.

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
)

func main() {
    server := gin.Default()

    funcs := map[string]func(string){
        "func2": func2,
        "func1": func1,
    }

    for k, v := range funcs {
        server.GET(k, func(ctx *gin.Context) {
            v(k)
        })
    }

    server.Run("127.0.0.1:8879")
}

func func1(name string) {
    fmt.Println("func1", name)
}

func func2(name string) {
    fmt.Println("func2", name)
}

Por favor, considere este código, aquí tengo un mapa de funciones. Ahora, al ejecutar esto es en el enrutador gin.

[GIN-debug] GET    /func2                    --> main.main.func1 (3 handlers)
[GIN-debug] GET    /func1                    --> main.main.func1 (3 handlers)

Ahora, no importa si hago una solicitud con func1 para func2, solo obtengo una función llamada. ¿Alguna idea por qué está sucediendo esto y cómo solucionarlo?

Nota: tengo que pasar la clave del mapa a la func.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que se llama a la misma función func1 para las rutas /func1 y /func2. Esto se debe a la forma en que se configuran los manejadores de ruta en el bucle. Como v en el bucle se refiere a la misma función func1, cuando se ejecuta v, siempre se llamará a func1.

    Para solucionar esto, se puede utilizar una clausura para capturar la referencia correcta de la función para cada ruta:

    for k, v := range funcs {
        handlerFunc := v // captura la referencia de función correcta para la clausura
        server.GET(k, func(ctx *gin.Context) {
            handlerFunc(k)
        })
    }
    

    Al capturar la referencia de la función en handlerFunc, creamos una clausura que pasa la función correcta a ejecutar para cada ruta. Esto debería solucionar el problema de que se llame a la misma función para todas las rutas.

Comments are closed.