第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go中切片的通用類型

Go中切片的通用類型

Go
慕尼黑5688855 2022-05-10 13:40:41
我不想擁有多個 API 獲取函數,而是想創(chuàng)建一個函數來獲取適當的數據庫,將其格式化為一個結構切片,然后返回它。以下是我的代碼的簡化版本:type Person struct {        Name   string `json:"name"`        IsCool bool   `json:"is_cool"`}type Pet struct {        Name     string `json:"name"`        IsFluffy bool   `json:"is_fluffy"`}type Group struct {        Name         string    `json:"name"`        CreationDate time.Time `json:"creation_date"`}type generic interface{}func FetchDB(dbName string) interface {        var collection []generic        var model      generic        switch dbName {        case "users":                collection = new([]User)                model      = new(User)        }        case "pets":                collection = new([]Pet)                model      = new(Pet)        case "groups":                collection = new([]Group)                model      = new(Group)        default:                return nil        }        iter := client.DB(dbName).Get()        for {                entry, err := iter.Next()                if err != nil {                        break                }                entry.ToStruct(&model)                collection = append(collection, model)        }        return collection}但是,調用此函數會導致cannot use new([]User) (type *[]User) as type []generic in assignment. 我的第一個問題是如何創(chuàng)建“通用”切片并為其分配類型。我的第二個問題是,這是否是設置這個功能的正確方法——使用generic界面感覺很hacky!——如果不是,那么設計這個功能的更明智的方法是什么。
查看完整描述

1 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

您正在使用new,而不是make切片。這兩個是不同的。new為類型分配內存(在這種情況下,是切片,而不是切片的內容),而make創(chuàng)建該類型的實例(make([]User,0) 將創(chuàng)建用戶切片)。


您可以按如下方式進行這項工作:


collection:=make([]generic,0)

switch dbName {

   case "users":

       model      = new(User)

   case "pets":

       model      = new(Pet)

   case "groups":

       model      = new(Group)

   default:

       return nil

}

而且您model已經是一個指針,并且您希望將數據存儲在該指針指向的位置:


  entry.ToStruct(model)  // Not &model

您正在返回一個interface{},而不是您可以 return []generic,這使您免于使用一種類型斷言來獲取值的數組部分。但這就是你的問題開始的時候,因為 Go 中沒有泛型,你必須編寫許多類型斷言來獲取你需要的數據。


有幾種方法可以做到這一點。一種方法是收集數據的回調函數:


func FetchDB(dbName string, collector func(entry Entry) {

  iter := client.DB(dbName).Get()

  for {

        entry, err := iter.Next()

        collector(entry)

   }

}

并將其稱為:


users:=make([]User,0)

FetchDB("users",func(entry Entry) {

   var u User

   entry.ToStruct(&u)

   users=append(users,u) 

 })


查看完整回答
反對 回復 2022-05-10
  • 1 回答
  • 0 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號