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
循环变量在每次迭代时都会被覆盖,因此所有处理程序都使用 v
和 k
的最后一个副本。您可以通过创建副本来修复:
for k, v := range funcs {
k:=k
v:=v
server.GET(k, func(ctx *gin.Context) {
v(k)
})
}
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
循环变量在每次迭代时都会被覆盖,因此所有处理程序都使用 v
和 k
的最后一个副本。您可以通过创建副本来修复:
for k, v := range funcs {
k:=k
v:=v
server.GET(k, func(ctx *gin.Context) {
v(k)
})
}