如何在Go语言的for循环中返回interface{}列表?
问题描述
假设项目数据结构如下:
| id | name | project_type |
|---|---|---|
| 1 | project_name | 1 |
| 2 | project_name | 1 |
| 3 | project_name | 1 |
| 4 | project_name | 2 |
| 5 | project_name | 2 |
| 6 | project_name | 3 |
| 7 | project_name | 3 |
| 8 | project_name | 3 |
| 9 | project_name | 4 |
| 10 | project_name | 4 |
原本可以通过以下Go代码获取project_type为1和2的两个列表:
func (d *db) ProjectList(Type, uid string, size uint64) (interface{}, interface{}, error) { type resp struct { Name string `json:"name"` Id string `json:"id"` ProjectType string `json:"project_type"` } var project_type_1 []*resp var project_type_2 []*resp sql = fmt.Sprintf(sql, where.String()) _, err := d.ctx.DB().SelectBySql("select * from project where project_type=1 order by rand() limit 10").Load(&project_type_1) _, err = d.ctx.DB().SelectBySql("select * from project where project_type=2 order by rand() limit 10").Load(&project_type_2) return project_type_1, project_type_2, err }
但现在project_type的数据源是一段JSON:[{"project_type":1,"name":"something else"},{"project_type":2,"name":"something else"},{"project_type":3,"name":"something else"},{"project_type":4,"name":"something else"}],project_type的类型不止两种,需要返回一个[]interface{}类型的列表。已尝试改写部分代码,但不知道后续如何编写,询问如何在Go语言的for循环中返回interface{}列表:
func NewProjectList(d *db) ([]interface{}, error) { var s = make([]ProjectType, 0) data, err := d.QueryString("project_type") if err != nil { return nil, err } err = json.Unmarshal([]byte(data), &s) if err != nil { return nil, err } for _, shortType := range s { fmt.Println("this is shortType", shortType) } return nil, err }
解决方案
可以按以下步骤修改代码,实现按每个project_type查询并收集结果到[]interface{}中:
- 首先确保
ProjectType结构体定义正确,能解析JSON中的字段:
type ProjectType struct { ProjectType int `json:"project_type"` Name string `json:"name"` }
- 完整修改后的
NewProjectList函数:
func NewProjectList(d *db) ([]interface{}, error) { // 定义解析project_type数据源的结构体 type ProjectType struct { ProjectType int `json:"project_type"` Name string `json:"name"` } // 定义项目查询结果的结构体 type resp struct { Name string `json:"name"` Id string `json:"id"` ProjectType string `json:"project_type"` } var projectTypes []ProjectType data, err := d.QueryString("project_type") if err != nil { return nil, err } err = json.Unmarshal([]byte(data), &projectTypes) if err != nil { return nil, err } // 初始化结果切片,预分配容量提升性能 result := make([]interface{}, 0, len(projectTypes)) for _, pt := range projectTypes { // 针对当前project_type执行查询 var projectList []*resp sqlStr := fmt.Sprintf("select * from project where project_type=%d order by rand() limit 10", pt.ProjectType) _, err := d.ctx.DB().SelectBySql(sqlStr).Load(&projectList) if err != nil { // 若某类型查询失败,可选择直接返回错误,或跳过该类型继续处理 return nil, err // 如需跳过错误类型,替换为:continue } // 将当前类型的项目列表添加到结果切片 result = append(result, projectList) } return result, nil }
关键说明
- 循环遍历JSON解析出的每个
ProjectType,逐个执行SQL查询获取对应类型的项目列表。 - Go中任意类型都可以赋值给
interface{},因此直接将[]*resp类型的项目列表追加到[]interface{}切片即可。 - 错误处理可根据业务需求调整:如果单个类型查询失败就终止整体流程,还是跳过错误类型继续处理其他类型。
内容的提问来源于stack exchange,提问作者user14114923
相关产品推荐
相关产品推荐

