1

私は http API を構築しており、すべてのハンドラーが JSON データを返すため、JSON マーシャリングと http 応答を処理するラッパー関数を構築しました (ラッパーの関連セクションとサンプル ハンドラーの 1 つを含めました)。下)。

任意にネストされた構造体を渡す最良の方法は何ですか (構造体には任意の型/フィールド数も含まれます)。現在、文字列キーとインターフェイス{}値を使用したマップに落ち着きました。これは機能しますが、これはこれを行うための最も慣用的な方法ですか?

result := make(map[string]interface{})
customerList(httpRequest, &result)

j, err := json.Marshal(result)
if err != nil {
    log.Println(err)
    errs := `{"error": "json.Marshal failed"}`
    w.Write([]byte(errs))
    return
}
w.Write(j)


func customerList(req *http.Request, result *map[string]interface{}) {
    data, err := database.RecentFiftyCustomers()
    if err != nil {
        (*result)["error"] = stringifyErr(err, "customerList()")
        return
    }

    (*result)["customers"] = data//data is a slice of arbitrarily nested structs
}
4

1 に答える 1

1

取得する型、構造、ネストが事前にわからない場合は、 のような一般的なものにデコードする以外に選択肢はありませんmap[string]interface{}。したがって、ここでは「慣用的な」または「非慣用的な」ものは何もありません。

(個人的には、どうにかして構造体を修正し、「任意の」入れ子や組み合わせを持たないようにします。)

于 2013-07-25T06:54:39.190 に答える