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