亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在結構中使用通用切片字段

在結構中使用通用切片字段

Go
aluckdog 2022-10-04 14:19:46
我們希望擁有type ResponseListDataPayload struct {    List     []*interface{} `json:"list"` //generic    TotalCnt int64          `json:"totalCnt"`    Page     int64          `json:"page"`    Step     int64          `json:"step"`}并且可以接受List[]*model.SomeModel{}queryResults := []*model.SomeModel{}resposeResult := &ResponseListDataPayload{    List:     queryResults,    TotalCnt: cnt,    Page:     pageInt,    Step:     stepInt,}或[]*model.AnotherModel{}queryResults := []*model.AnotherModel{}resposeResult := &ResponseListDataPayload{    List:     queryResults,    TotalCnt: cnt,    Page:     pageInt,    Step:     stepInt,}這在Java中非常簡單,這在Go中可能嗎?
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

前往 1.18

您現在可以擁有參數化結構:


type ResponseListDataPayload[T any] struct {

    List     []T            `json:"list"` //generic

    TotalCnt int64          `json:"totalCnt"`

    Page     int64          `json:"page"`

    Step     int64          `json:"step"`

}

請記住,泛型結構必須使用顯式類型參數進行實例化:


queryResults := []*model.SomeModel{}

responseResult := &ResponseListDataPayload[*model.SomeModel]{

    List:     queryResults,

    // other fields

}

如果你想進一步提高代碼重用率,并“泛化”結構初始化,你可以使用構造函數。函數可以利用類型推斷來省略寫出類型參數:


// add to func signature other arguments as needed

func NewResponseFor[T any](list []T) *ResponseListDataPayload[T] {

    return &ResponseListDataPayload[T]{ List: list }

}

并將其用作:


queryResults := // some query results

responseResult := NewResponseFor(queryResults)

示例:https://gotipplay.golang.org/p/jYTHegaeubR


前往 1.17 及以下

這在圍棋中是可能的嗎?


不,實際上不是泛型類型,它只是一個具有空方法集的接口。interface{}


形式上,您可以為其分配任何具體值,因為可賦值性要求值的方法集是接口方法集的超集,并且任何集都是空集的超集 ()。?


它與像Java這樣的參數化類型不是一回事,因此在Go中不能分配給。List<T>[]Foo[]interface{}


您必須在循環中處理單個元素:


var m []*model.anotherModel

// populate m

for _, v := range m {

    resp.List = append(resp.List, v)

}

同樣,不要使用指向空接口 的指針。請改用。*interface{}interface{}


如果您的目標只是序列化 JSON(基于結構上是否存在標記),則可以將字段聲明為,并且出于上述原因,您可以將任一切片值分配給它。從而避免了額外的切片操作。然后,json 包將根據 中框出的具體值進行序列化。Listinterface{}interface{}


查看完整回答
反對 回復 2022-10-04
?
MMTTMM

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

在 Go 1.18 中,您將能夠使用真正的 go 泛型來執行類似操作:


func convert[S any](src []S) []interface{} {

    dst := make([]interface{}, 0, len(src))

    for _, v := range src {

        dst = append(dst, v)

    }

    return dst

}

//...

resp.List = convert(m)

但是,在 1.18 發布并且更多的代碼庫包含泛型之前,您仍然需要手動進行轉換。


就像大家說的,不要使用.*interface{}


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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