dictionary - 为什么 map 值变得不存在?

标签 dictionary go

我正在使用映射将随机字符串键存储到 *os.File 对象。用户将上传一个文件,我想在全局 map 中保存对该文件的引用,以便稍后删除它。

我有一个 http 处理程序来处理上传,最后,我将一个随 secret 钥从操作系统 uuidgen 映射到类型为 *os.File 的“logBu​​ndleFile”。

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” bool 值总是返回 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。

但在 session 处理程序中,相同的字符串键映射到 nil *os.File。我不知道发生了什么。

2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE
 Type: string
2019/08/27 19:49:49 val: &{0xc000160120} Type: *os.File

2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE Type: string
2019/08/27 19:49:49 val: <nil> Type: *os.File

最佳答案

这是因为在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[:]))

关于dictionary - 为什么 map 值变得不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683619/

相关文章:

Python:无法从另一个文件导入字典

json - Swift 3 字典 JSON

go - beego中可以使用多个注解吗?

inheritance - 如何在 Golang 中为多种类型编写一个函数?

go - 如何使go-colly与elasticsearch Hook ?

go - 在自定义拦截器/中间件中访问 gRPC 请求对象

java - 获取内部 JSON 数组值

python - 优化python中两个字典列表的合并

go - tls : handshake failure when enabling tls for RabbitMQ with streadway/amqp

ruby - 理解 Ruby 中的 map