私はREST APIのGoラッパーを実装しています。基本的にはJSONを解析し、適切な構造体の型を返す必要があります。私自身は、この多くのをやって見つける:このGoコードをDRYにするにはどうすればよいですか?
// GetBlueprintDetails returns details about a blueprint
func (c *Client) GetBlueprintDetails(projectID string, blueprintID string) (*BlueprintDetails, *APIError) {
path := fmt.Sprintf("projects/%s/blueprints/%s", projectID, blueprintID)
res, err := c.Request("GET", path, nil, nil)
if err != nil {
return nil, err
}
var ret BlueprintDetails
e := json.Unmarshal(res.Body, &ret)
if e != nil {
return nil, &APIError{Error: &e}
}
return &ret, nil
}
// GetProjects returns a list of projects for the user
func (c *Client) GetProjects() (*[]Project, *APIError) {
res, err := c.Request("GET", "projects", nil, nil)
if err != nil {
return nil, err
}
var ret []Project
e := json.Unmarshal(res.Body, &ret)
if e != nil {
return nil, &APIError{Error: &e}
}
return &ret, nil
}
二つの関数の唯一の違いは、基本的にアンマーシャル構造体の一種です。私はGoにジェネリックがないことを知っていますが、これをDRYにするパターンが必要です。
アイデア?
同様の問題は私が両方のタイプのリクエストを解析するためにfat構造体を作成すると、他の変数は空になりますか? "BlueprintDetails"構造体を共有できますか? –