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

Go语言:如何在循环外部输出变量的所有查询结果值?

问题分析与解决

你的代码问题很明确:循环中每次都直接覆盖变量s的值,没有做追加操作。不管是s = signup.Names还是s = fmt.Sprintf("%s", signup.Names),每轮循环都会把之前存储的内容清空,只保留当前遍历到的单个用户名,所以最终返回的只会是最后一条查询结果(你描述的返回第一个可能是测试场景的特殊情况)。

修复方案

方案1:直接字符串拼接(简单场景)

import "log"

type Signup struct {
    Names  string
    Emails string
}

func FindNames() string {
    db := Connect()
    var s string
    rows, err := db.Query("select names from Signup")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var signup Signup
        err := rows.Scan(&signup.Names)
        if err != nil {
            log.Fatal(err)
        }
        // 用逗号分隔多个名字,可按需修改分隔符
        if s != "" {
            s += ", "
        }
        s += signup.Names
    }
    // 检查遍历过程中是否出现错误
    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
    return s
}

方案2:用切片存储再统一处理(更灵活)

这种方式适合后续需要调整输出格式的场景:

import (
    "log"
    "strings"
)

type Signup struct {
    Names  string
    Emails string
}

func FindNames() string {
    db := Connect()
    var names []string
    rows, err := db.Query("select names from Signup")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var signup Signup
        err := rows.Scan(&signup.Names)
        if err != nil {
            log.Fatal(err)
        }
        names = append(names, signup.Names)
    }
    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
    // 把切片转为带分隔符的字符串
    return strings.Join(names, ", ")
}

方案3:用strings.Builder优化性能(大数据量场景)

如果查询结果很多,直接字符串拼接会频繁分配内存,用strings.Builder效率更高:

import (
    "log"
    "strings"
)

type Signup struct {
    Names  string
    Emails string
}

func FindNames() string {
    db := Connect()
    var sb strings.Builder
    rows, err := db.Query("select names from Signup")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    first := true
    for rows.Next() {
        var signup Signup
        err := rows.Scan(&signup.Names)
        if err != nil {
            log.Fatal(err)
        }
        if !first {
            sb.WriteString(", ")
        }
        sb.WriteString(signup.Names)
        first = false
    }
    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
    return sb.String()
}

关键注意点

  • 一定要在循环结束后调用rows.Err(),因为rows.Next()返回false可能是遇到了错误,而非遍历完成。
  • 分隔符可以根据需求调整(比如换行符\n、空格等)。

内容的提问来源于stack exchange,提问作者Veins Tree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:01:06