簡體   English   中英

在golang中將動態結構傳遞給函數

[英]Passing in dynamic struct into function in golang

我有幾個結構,產品和類別。 我有下面列出的 2 個函數,它們具有相同的邏輯,只是使用和返回的結構不同。 無論如何,我可以抽象出結構數據類型並在名為GetObjects的單個函數中使用相同的邏輯嗎?

func GetCategories(collection *mongo.Collection) []Category {
    ctx := context.Background()
    cats := []Category{}
    cur, err := collection.Find(ctx, bson.M{})
    if err != nil {
        log.Fatal("Error: ", err)
    }
    for cur.Next(context.TODO()) {
        var cat Category
        err = cur.Decode(&cat)
        if err != nil {
            log.Fatal(err)
        }
        cats = append(cats, cat)
    }
    return cats
}

func GetProducts(collection *mongo.Collection) []Product {
    ctx := context.Background()
    prods := []Product{}
    cur, err := collection.Find(ctx, bson.M{})
    if err != nil {
        log.Fatal("Error: ", err)
    }
    for cur.Next(context.TODO()) {
        var prod Product
        err = cur.Decode(&prod)
        if err != nil {
            log.Fatal(err)
        }
        prods = append(prods, prod)
    }
    return prods
}

如果您要傳入要加載結果的目的地,則可以創建一個通用的GetObjs()

就像是:

func GetObjs(c *mongo.Collection, dst interface{})

調用者負責傳遞一個准備好的切片或一個指向存儲結果的切片變量的指針。

還要注意context.Context應該被傳遞而不是在函數內部任意創建:

func GetObjs(ctx context.Context, c *mongo.Collection, dst interface{})

此外,錯誤應該返回而不是“吞下”,因此如果發生錯誤,可以在調用者處適當處理:

func GetObjs(ctx context.Context, c *mongo.Collection, dst interface{}) error

此外,如果您需要所有結果,則無需遍歷它們並逐一解碼。 只需使用Cursor.All()

這就是“改進后的” GetObjs()樣子:

func GetObjs(ctx context.Context, c *mongo.Collection, dst interface{}) error {
    cur, err := c.Find(ctx, bson.M{})
    if err != nil {
        return err
    }
    return cur.All(ctx, dst)
}

(雖然這變得很簡單,但不確定它是否保證它自己的存在。)

這就是你可以使用它的方式:

ctx := ... // Obtain context, e.g. from the request: r.Context()
c := ... // Collection you want to query from

var cats []Category
if err := GetObjs(ctx, c, &cats); err != nil {
    // Handle error
    return
}
// Use cats

var prods []Product
if err := GetObjs(ctx, c, &prods); err != nil {
    // Handle error
    return
}
// Use prods

暫無
暫無

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

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