Golang の動的構造体の戻り値
Revel プロジェクトでは、異なるモデル間で戻り値の型に大幅な冗長性が存在することがよくあります。
これら 2 つを考慮してください関数:
func (c Helper) Brands() []*models.Brand { // Select from rethinkdb and populate models.Brand var brands []*models.Brand rows.All(&brands) return brands } func (c Helper) BlogPosts() []*models.Post { // Select from rethinkdb and populate models.Post var posts []*models.Post rows.All(&posts) return posts }
どちらの関数も同じタイプのデータ (構造体のスライスへのポインター) を返します。冗長性を減らすための 1 つのアイデアは、さまざまな型を表すことができるインターフェイスを返す汎用の戻り関数を作成することです。
func (c Helper) ReturnModels(modelName string) interface{} { // Select from rethinkdb based on modelName and return interface{} }
このアプローチでは、戻り関数が 1 つだけになり、コードが簡素化され、コードが削減されます。
ただし、返されるインターフェースには次のものが付属していることに注意することが重要です。{}注意:
次のコード例は、このアプローチを示しています。
package main import "fmt" type Post struct { Author string Content string } type Brand struct { Name string } var database map[string]interface{} func init() { database = make(map[string]interface{}) brands := []Brand{ {Name: "Gucci"}, {Name: "LV"}, } database["brands"] = brands posts := []Post{ {Author: "J.K.R", Content: "Whatever"}, } database["posts"] = posts } func main() { fmt.Println("List of Brands:") if brands, ok := ReturnModels("brands").([]Brand); ok { fmt.Printf("%v", brands) } fmt.Println("\nList of Posts:") if posts, ok := ReturnModels("posts").([]Post); ok { fmt.Printf("%v", posts) } } func ReturnModels(modelName string) interface{} { return database[modelName] }
以上がGolang の動的構造体の型リターンは、型安全性のリスクを管理しながらコード効率をどのように向上させることができるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。