go 连接mysql查询出来的结果,用map存的话,有无序问题,

问题:如题

本来是第一行的,显示成第二行之类。

请问如解决?

代码如下:

package main

import (
    "database/sql"
    "fmt"
    _ "mysqldriver"
)

func main() {
    selects()
}
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

/**
查询演示
*/
func selects() {
    db, err := sql.Open("mysql", "root:sz123@tcp(127.0.0.1:3306)/jcrm?charset=utf8")
    checkErr(err)

    // 查询数据
    //查询数据,取所有字段
    rows2, _ := db.Query("SELECT * FROM cd_gentuanyou limit 0,10")
    //返回所有列
    cols, _ := rows2.Columns()
    //这里表示一行所有列的值,用[]byte表示
    vals := make([][]byte, len(cols))
    //这里表示一行填充数据
    scans := make([]interface{}, len(cols))
    //这里scans引用vals,把数据填充到[]byte里
    for k, _ := range vals {
        scans[k] = &vals[k]
    }

    i := 0
    result := make(map[int]map[string]string)
    for rows2.Next() {
        //填充数据
        rows2.Scan(scans...)
        //每行数据
        row := make(map[string]string)
        //把vals中的数据复制到row中
        for k, v := range vals {
            key := cols[k]
            fmt.Printf(string(v))
            //这里把[]byte数据转成string
            row[key] = string(v)
        }
        //放入结果集
        result[i] = row
        i++
    }
    //fmt.Println(result)
    for k, v := range result {
        fmt.Printf("第%d行", k)
        fmt.Println(v["gentuanyouid"] + "===>" + v["title"])
    }
    db.Close()
}
阅读 10k
10 个回答

这个是map的机制,map存储数据本身是没有一定顺序的,每次遍历map可能顺序都不一样。

把map的value存储成一个list

用list存吧,存入什么顺序 输入就是什么顺序,map的机制就是这样

额,如果只是为了打印而打印,为什么不这样呢?

func selects() {
    for rows2.Next() {
        fmt.Printf("第%d行", k++)
        fmt.Println(row["gentuanyouid"] + "===>" + row["title"])
    }
}

跟团游?去哪国的,人均多少啊:)

hash表本来是无序的,传说go语言开发者为了让Gopher别依赖map存入的顺序,而随机化了用range取map值的顺序。

看了下你的代码,你的key本来是有序的。用这种方式:

 for i:=0;i<len(result);i++ {
        fmt.Println(result[i])
    }

不就是有序的了吗。

map本身就是无序的,你需要的大致可以用list套map

map存那就没意思了!是不是之前开发php用多了 hashtable当然牛逼了,但是golang并不惯你那么多毛病!建议使用gorm这个orm类库,

var list []*Item
if db.Where("status>1").Find(&list).Error;err!=nil{
    fmt.Println("error",err.Error())
}

嗯,用list.

Map是一种以Key-Value的方式存储数据的键值对,是为了快速找到Key所对应的Value。一对Key-Value在存进Map的时候就是无序的,因为Map并没有存储上一个Key-Value的地址,所以并不能保证数据打印出来是有序的。就跟java一样,HashMap也是无序的,有序的LinkedHashMap也是封装之后的。

别听他们扯,这是golang的诸多不足甚至缺陷之一。以后肯定会调整,但是目前阶段只能不用map。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题