2 回答

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{}

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{}
- 2 回答
- 0 關注
- 89 瀏覽
添加回答
舉報