簡體   English   中英

強類型語言中的“動態”參數?

[英]"dynamic" parameters in a strongly-typed language?

我一直在學習編碼,最近在 javascript 完成了一個服務器-客戶端項目。在那個服務器 (Node.js) 中,我給自己寫了一個“響應者”function,我在整個程序中調用了數十次:

function sendResponse(req, res, err, response, redirect) {
    if (err) {
        res.status(err.status)
        return res.json(err.message || err.error)
    }
    if (response) {
        res.status(response.status)
        return res.json(response.response || response.message)
    }
    if (redirect) {
        return res.redirect(redirect)
    }
    res.status(500)
    return res.json({message: err.err || "Unknown server error", user: req.userObj.email || null})
}

我現在正在嘗試在 Go 中編寫一個類似的 API 服務后端。當然你可以將nil傳遞給函數,但我不知道如何允許這些參數中的任何一個是“動態的”——也許就是這樣靜態類型語言的重點是什么? 在 javascript 中, response參數可以是帶有字符串鍵和值的 object,或者它可以包含帶有附加數據的嵌套對象以發送回客戶端。 在Go中,我可以將一個map作為參數,但是我必須提前將其定義為一個字符串:字符串map。如果我想嵌套一個map,我還必須定義嵌套map的映射.

這是我在 Go 中得到的最接近的:

func responder(w http.ResponseWriter, m map[string]string, s int) {
    w.WriteHeader(s)
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    if m != nil {
        r := createJson(m)
        w.Write(r)
        return
    }
    w.Write([]byte("Good job"))
    return
}

func createJson(m map[string]string) ([]byte) {
    j, err := json.Marshal(m)
    if err != nil {
        fmt.Println(err)
        return nil
    }
    return j
}

但是我開始覺得我只是在考慮如何錯誤地使用靜態類型語言做事。

編輯:這是指針的工作嗎? 我可以使用指向可能包含或不包含嵌套映射的 map 的指針嗎?

您可以在結構內創建一個帶有類型字段的結構,並使用 switch case 根據類型進行操作。

你可以在這里使用 interface{} 如下所示

func responder(w http.ResponseWriter, m interface{}, s int) {
    w.WriteHeader(s)
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    if m != nil {
        r := createJson(m)
        w.Write(r)
        return
    }
    w.Write([]byte("Good job"))
    return
}

func createJson(m interface{}) ([]byte) {
    j, err := json.Marshal(m)
    if err != nil {
        fmt.Println(err)
        return nil
    }
    return j
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM