任意类型

在 Go 里:

any

就是:

interface{}

它表示“任意类型”。

所以:

map[string]any

可以理解成前端里的:

Record<string, any>

或者更接近 JSON object:

{
  [key: string]: any
}

你这里:

model.PageResult[map[string]any]

意思就是:

分页结果里的 List 是一组对象,每个对象字段不固定

等价理解:

PageResult<Record<string, any>>

但注意:

any

本身是任意类型;

map[string]any

才更像“object”。

如果你写:

PageResult[any]

那就是:

List []any

里面可以是对象、字符串、数字、布尔值都行。

如果你写:

PageResult[map[string]any]

那就是:

List []map[string]any

里面每一项必须是一个对象。
你这个 aPaaS items 是对象数组,所以用 map[string]any 更合适。

可以,用类型别名:

type AnyMap = map[string]interface{}

或者 Go 1.18+ 更推荐:

type AnyMap = map[string]any

放到 model 包里,比如:

package model

type AnyMap = map[string]any

然后就可以写:

model.PageResult[model.AnyMap]

你的中间结构也可以写:

type apaasRecordData struct {
	Items         []model.AnyMap `json:"items"`
	Total         int            `json:"total"`
	NextPageToken string         `json:"next_page_token"`
}

返回:

return model.PageResult[model.AnyMap]{
	List:    data.Items,
	Total:   int64(data.Total),
	Size:    size,
	Current: current,
	HasMore: data.NextPageToken != "",
}, nil

注意是类型别名:

type AnyMap = map[string]any

不是新类型:

type AnyMap map[string]any

两者区别是:

type AnyMap = map[string]any

完全等价于 map[string]any,兼容性最好。

type AnyMap map[string]any

是一个新的类型,有时候需要手动转换。