为了账号安全,请及时绑定邮箱和手机立即绑定

为什么地图值变得不存在?

为什么地图值变得不存在?

Go
隔江千里 2023-07-17 14:54:20
我正在使用映射将随机字符串键存储到 *os.File 对象。用户将上传一个文件,我想在全局地图中保留对该文件的引用,以便稍后删除它。我有一个 http 处理程序来处理上传,最后,我将操作系统 uuidgen 中的随机密钥映射到 *os.File 类型的“logBundleFile”。var db = map[string]*os.File{}func uploadHandler(w http.ResponseWriter, r *http.Request) {    r.ParseMultipartForm(5 << 30)    file, handler, err := r.FormFile("file")    if err != nil {        log.Fatalf("Error retrieving the file: %v", err)        return    }    defer file.Close()    logBundleFile, err := ioutil.TempFile("", handler.Filename)    if err != nil {        log.Fatal(err)    }    defer logBundleFile.Close()    fileBytes, err := ioutil.ReadAll(file)    if err != nil {        log.Fatalf("Error reading file: %v", err)    }    logBundleFile.Write(fileBytes)    id, err := exec.Command("uuidgen").Output()    idStr := string(id[:])    //id := "1"    if err != nil {        log.Fatal(err)    }    db[idStr] = logBundleFile    log.Printf("ID: %v Type: %T\n", idStr, idStr)    log.Printf("val: %v Type: %T\n\n", db[idStr], db[idStr])    http.Redirect(w, r, fmt.Sprintf("/%s", idStr), http.StatusMovedPermanently)}完成后,您将被重定向到此 sessionHandler。它将检查正文中的 ID 是否有效,即映射到 *os.File。“ok”布尔值总是返回 false。func sessionHandler(w http.ResponseWriter, r *http.Request) {    vars := mux.Vars(r)    id := vars["id"]    log.Printf("ID: %v Type: %T\n", id, id)    log.Printf("val: %v Type: %T\n", db[id], db[id])    if val, ok := db[id]; ok {        w.Write([]byte(fmt.Sprintf("Session %s %v", id, val)))    } else {        http.Redirect(w, r, "/", http.StatusMovedPermanently)    }}这是打印的输出。在 uploadHandler 中,我们可以看到有一个映射到非 nil *os.File 的字符串键。但在会话处理程序中,相同的字符串键映射到 nil *os.File。我不知道发生了什么事。2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE Type: string2019/08/27 19:49:49 val: &{0xc000160120} Type: *os.File2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE Type: string2019/08/27 19:49:49 val: <nil> Type: *os.File
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

这是因为在 中uploadHandler,id变量包含换行符。如果我们仔细查看日志,我们可以看到它。不知何故,Type: string文本打印在第二行。


2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE // <-- newline

 Type: string

2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE Type: string

对 进行修剪操作idStr应该可以解决问题。


idStr := strings.TrimSpace(string(id[:]))


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信