avatar

Go Range 的坑

go range 的坑

1
2
3
4
5
6
7
8
9
10
11
12
13
apiV1 = r.Group("/api/v1")
{
for _, hConf := range *config.HookConfig {
apiV1.GET(hConf.Name, v1.HandleHook(&hConf))
}
}

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET /api/v1/docs --> hook/controller/v1.HandleHook.func1 (4 handlers)
[GIN-debug] GET /api/v1/web --> hook/controller/v1.HandleHook.func1 (4 handlers)

然后发现请求 /api/v1/docs 和 /api/v1/web , 都是为同一结果

代码修正

1
2
3
4
5
6
7
apiV1 = r.Group("/api/v1")
{
for _, hConf := range *config.HookConfig {
conf := hConf
apiV1.GET(hConf.Name, v1.HandleHook(&conf))
}
}

多加了 conf := hConf

原因

根本原因在于for range 会使用同一块内存去接收循环中的值

文章作者: 喵九命
文章链接: http://blog.ik3s.top/2020/04/03/Go-Range-%E7%9A%84%E5%9D%91/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 远方除了遥远一无所有
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论