gpt4 book ai didi

go - 在 Go 中请求重新路由,映射 HandleFuncs

转载 作者:IT王子 更新时间:2023-10-29 01:56:57 26 4
gpt4 key购买 nike

我想将路径名映射到位于不同位置的文件。但是当我访问 /a 时,我的代码服务于 /path/c.txt,而不是 /path/a.txt。我做错了什么?

package main

import (
"fmt"
"net/http"
)

func main() {
fileRoutes := map[string]string {
"/a": "/path/a.txt",
"/b": "/path/b.txt",
"/c": "/path/c.txt",
}

for req, path := range fileRoutes {
http.HandleFunc(req, func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("actual request: %v\n", r.URL.Path)
fmt.Printf("registered request: %v\n", req)

r.URL.Path = path

fmt.Println(req)
fmt.Println(path)

// serveFile(w, r)
})
}

http.ListenAndServe(":8004", nil)
}

此示例代码产生:

actual request: /a
registered request: /c
/c
/path/c.txt

谢谢!

最佳答案

问题是所有句柄函数都在访问相同的 reqpath,它们被设置为循环后循环的最后一个变量,它们是 /c/path/c.txt

要解决此问题,请在 http.HandleFunc(...) 之前添加 req,path := req,path

看起来很奇怪。它所做的是在循环范围内声明新的reqpath,这是每次迭代都是新的,所以每个闭包都绑定(bind)到不同的值。

关于go - 在 Go 中请求重新路由,映射 HandleFuncs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51233026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com