Golang:带有地图的 Gin 路由器只选择一个处理程序

Golang: Gin router with map is picking only one handler

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)
}

请考虑这段代码,这里我有一个函数映射。现在 运行 这是杜松子酒路由器。

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

现在,无论是否使用 func1 为 func2 发出请求,我都只会调用一个函数。任何想法,为什么会发生这种情况以及如何解决这个问题。

Note: I have to pass the key from map to func

循环变量在每次迭代时都会被覆盖,因此所有处理程序都使用 vk 的最后一个副本。您可以通过创建副本来修复:

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