You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言的for循环中返回interface{}列表?

问题描述

假设项目数据结构如下:

idnameproject_type
1project_name1
2project_name1
3project_name1
4project_name2
5project_name2
6project_name3
7project_name3
8project_name3
9project_name4
10project_name4

原本可以通过以下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{}中:

  1. 首先确保ProjectType结构体定义正确,能解析JSON中的字段:
type ProjectType struct {
    ProjectType int    `json:"project_type"`
    Name        string `json:"name"`
}
  1. 完整修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:37:56