为了账号安全,请及时绑定邮箱和手机立即绑定

Go SQL 扫描的行被覆盖

Go SQL 扫描的行被覆盖

Go
一只甜甜圈 2021-10-25 14:33:57
我正在尝试从 SQL 服务器上的表中读取所有行,并将它们存储在字符串切片中以供以后使用。我遇到的问题是,每次扫描新行时,以前扫描的行都会被覆盖,即使我已将所有可变字节切片转换为不可变字符串并将结果切片保存到另一个切片。这是我正在使用的代码:rawResult := make([]interface{}, len(cols)) // holds anything that could be in a rowresult := make([]string, len(cols)) // will hold all row elements as stringsvar results [][]string // will hold all the result string slicesdest := make([]interface{}, len(cols)) // temporary, to pass into scanfor i, _ := range rawResult {    dest[i] = &rawResult[i] // fill dest with pointers to rawResult to pass into scan}for rows.Next() { // for each row    err = rows.Scan(dest...) // scan the row    if err != nil {        log.Fatal("Failed to scan row", err)    }    for i, raw := range rawResult { // for each scanned byte slice in a row        switch rawtype := raw.(type){ // determine type, convert to string        case int64:            result[i] = strconv.FormatInt(raw.(int64), 10)        case float64:            result[i] = strconv.FormatFloat(raw.(float64), 'f', -1, 64)        case bool:            result[i] = strconv.FormatBool(raw.(bool))        case []byte:            result[i] = string(raw.([]byte))        case string:            result[i] = raw.(string)        case time.Time:            result[i] = raw.(time.Time).String()        case nil:            result[i] = ""        default: // shouldn't actually be reachable since all types have been covered            log.Fatal("Unexpected type %T", rawtype)        }    }    results = append(results, result) // append the result to our slice of results}我确信这与 Go 处理变量和内存的方式有关,但我似乎无法修复它。有人可以解释我不理解的内容吗?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

您应该为每个数据行创建新切片。请注意,切片有一个指向底层数组的指针,因此您添加的每个切片results在实际数据数组上都有相同的指针。这就是你面对这种行为的原因。


查看完整回答
反对 回复 2021-10-25
?
温温酱

TA贡献1752条经验 获得超4个赞

移动result := make([]string, len(cols))到您的for循环,循环通过可用行。


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信