[英]"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.