在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ golang通過sql排序查詢出的數(shù)據(jù),以map的形式返回,順序亂了?

golang通過sql排序查詢出的數(shù)據(jù),以map的形式返回,順序亂了?

下載:

//下載csv
func doDown() {
    csvName := downDir + time.Now().Format("2006-01-02") + ".csv"
    file, _ := os.OpenFile(csvName, os.O_WRONLY|os.O_CREATE, os.ModePerm)
    w := csv.NewWriter(file)
    //防止中午亂碼
    file.WriteString("\xEF\xBB\xBF")
    w.Write([]string{"標題", "更新時間", "鏈接"})
    pageSize := 1000
    page := 1
    db, err := mysqlUtil.CreateReadDb()
    if err != nil {
        fmt.Println("connect db err")
        os.Exit(1)
    }
    for {
        offset := (page - 1) * pageSize
        sqlStr := `select title,uptime,url from film order by uptime desc limit ` + strconv.Itoa(offset) + `,` + strconv.Itoa(pageSize)
        fmt.Println(sqlStr)
        res, err := db.Query(sqlStr)
        if err != nil {
            fmt.Println("query err ", err)
        }
        rows, err := mysqlUtil.GetRows(res)
        if len(rows) > 0 {
            for _, v := range rows {
                w.Write([]string{v["title"], v["uptime"], host + v["url"]})
            }
        } else {
            break
        }
        page++
    }
    w.Flush()
}

sql是根據(jù)uptime倒序取的數(shù)據(jù),為啥寫csv得時候,順序都亂了呢?
打印了一下輸出,發(fā)現(xiàn)是rows, err := mysqlUtil.GetRows(res)這個的問題。
這里貼出這個函數(shù)的代碼:

func GetRows(query *sql.Rows) (map[int]map[string]string, error) {
    column, err := query.Columns()              //讀出查詢出的列字段名
    if err != nil {
        return nil, fmt.Errorf("getRows db err:", err)
    }
    values := make([][]byte, len(column))     //values是每個列的值,這里獲取到byte里
    scans := make([]interface{}, len(column)) //因為每次查詢出來的列是不定長的,用len(column)定住當次查詢的長度
    for i := range values {                   //讓每一行數(shù)據(jù)都填充到[][]byte里面
        scans[i] = &values[i]
    }
    results := make(map[int]map[string]string) //最后得到的map
    i := 0
    for query.Next() { //循環(huán),讓游標往下移動
        if err := query.Scan(scans...); err != nil { //query.Scan查詢出來的不定長值放到scans[i] = &values[i],也就是每行都放在values里
            return nil,fmt.Errorf("scan result db err:", err)
        }
        row := make(map[string]string) //每行數(shù)據(jù)
        for k, v := range values {     //每行數(shù)據(jù)是放在values里面,現(xiàn)在把它挪到row里
            key := column[k]
            row[key] = string(v)
        }
        results[i] = row //裝入結(jié)果集中
        i++
    }
    return results,nil
}

因為返回的是map,map是無序的,所有返回類型需要做以下調(diào)整:

func GetRowsSlice(query *sql.Rows) ([]map[string]string, error) {
    column, err := query.Columns()              //讀出查詢出的列字段名
    if err != nil {
        return nil, fmt.Errorf("getRows db err:", err)
    }
    values := make([][]byte, len(column))     //values是每個列的值,這里獲取到byte里
    scans := make([]interface{}, len(column)) //因為每次查詢出來的列是不定長的,用len(column)定住當次查詢的長度
    for i := range values {                   //讓每一行數(shù)據(jù)都填充到[][]byte里面
        scans[i] = &values[i]
    }
    results := []map[string]string{} //最后得到的map
    i := 0
    for query.Next() { //循環(huán),讓游標往下移動
        if err := query.Scan(scans...); err != nil { //query.Scan查詢出來的不定長值放到scans[i] = &values[i],也就是每行都放在values里
            return nil,fmt.Errorf("scan result db err:", err)
        }
        row := make(map[string]string) //每行數(shù)據(jù)
        for k, v := range values {     //每行數(shù)據(jù)是放在values里面,現(xiàn)在把它挪到row里
            key := column[k]
            row[key] = string(v)
        }
        //results[i] = row //裝入結(jié)果集中
        results = append(results, row)
        i++
    }
    return results,nil
}
回答
編輯回答
悶油瓶

map無序的,哈哈

2017年1月9日 12:04
編輯回答
哎呦喂

你們都沒看過golang的文檔吧,文檔都說了,map類型是無序的,千萬不要當成有序的

2017年8月14日 21:30
編輯回答
挽青絲

我也遇到了 同問

2017年12月1日 18:00
編輯回答
離夢

見問題描述,把sql查詢結(jié)果以slice形式返回即可

2018年2月15日 18:20