我們要有
type ResponseListDataPayload struct {
List []*interface{}。`json: "list"` /generic
TotalCnt int64 `json: "totalCnt"`
頁面 int64 `json: "page"`
步驟 int64 `json: "step"
}
而List可以接受[]*model.someModel{}
queryResults :=[]*model.someModel{}
resposeResult := &ResponseListDataPayload{
串列:queryResults。
TotalCnt: cnt,
頁面:pageInt,
步驟: stepInt,
}
或者 []*model.anotherModel{}
queryResults := []*model.anotherModel{}
resposeResult := &ResponseListDataPayload{
串列:queryResults。
TotalCnt: cnt,
Page: pageInt,
步驟: stepInt,
}
這在Java中是很直接的,在go中能不能做到呢?
uj5u.com熱心網友回復:
這在go中是否可行?
不,interface{}實際上不是一個泛型,它只是一個帶有空方法集的介面。
實際上,你可以將任何具體的值分配給它,因為可分配性要求該值的方法集是介面方法集的超集,而任何集合都是空集的超集(?)。
它與Java的List<T>這樣的引數化型別不是一回事,因此在Go中,[]Foo不能賦值給[]interface{}。
你必須在一個回圈中處理單元素:
var m []*model.otherModel
//填充m
for _, v := range m {
resp.List = append(resp.List, v)
}
類似地,不要使用指向空介面*interface{}的指標。使用interface{}來代替。
如果您的目標只是序列化JSON(基于您結構上標簽的存在),您可以將List欄位宣告為interface{},并且您將能夠將您的分片值中的任何一個分配給它,原因如上所述。這樣就避免了一個額外的分片操作。然后json包將根據interface{}中框定的具體值進行序列化。
uj5u.com熱心網友回復:
在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{}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/313742.html
標籤:
上一篇:使用For回圈創建多個表
