鍍金池/ 問(wèn)答/GO  數(shù)據(jù)庫(kù)/ go 連接mysql查詢出來(lái)的結(jié)果,用map存的話,有無(wú)序問(wèn)題,

go 連接mysql查詢出來(lái)的結(jié)果,用map存的話,有無(wú)序問(wèn)題,

問(wèn)題:如題

本來(lái)是第一行的,顯示成第二行之類。

請(qǐng)問(wèn)如解決?

代碼如下:

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)

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

    i := 0
    result := make(map[int]map[string]string)
    for rows2.Next() {
        //填充數(shù)據(jù)
        rows2.Scan(scans...)
        //每行數(shù)據(jù)
        row := make(map[string]string)
        //把vals中的數(shù)據(jù)復(fù)制到row中
        for k, v := range vals {
            key := cols[k]
            fmt.Printf(string(v))
            //這里把[]byte數(shù)據(jù)轉(zhuǎn)成string
            row[key] = string(v)
        }
        //放入結(jié)果集
        result[i] = row
        i++
    }
    //fmt.Println(result)
    for k, v := range result {
        fmt.Printf("第%d行", k)
        fmt.Println(v["gentuanyouid"] + "===>" + v["title"])
    }
    db.Close()
}
回答
編輯回答
淡墨

hash表本來(lái)是無(wú)序的,傳說(shuō)go語(yǔ)言開(kāi)發(fā)者為了讓Gopher別依賴map存入的順序,而隨機(jī)化了用range取map值的順序。

看了下你的代碼,你的key本來(lái)是有序的。用這種方式:

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

不就是有序的了嗎。

2017年10月17日 21:02
編輯回答
小眼睛

map存那就沒(méi)意思了!是不是之前開(kāi)發(fā)php用多了 hashtable當(dāng)然牛逼了,但是golang并不慣你那么多毛病!建議使用gorm這個(gè)orm類庫(kù),

var list []*Item
if db.Where("status>1").Find(&list).Error;err!=nil{
    fmt.Println("error",err.Error())
}
2017年4月27日 13:59
編輯回答
病癮

Map是一種以Key-Value的方式存儲(chǔ)數(shù)據(jù)的鍵值對(duì),是為了快速找到Key所對(duì)應(yīng)的Value。一對(duì)Key-Value在存進(jìn)Map的時(shí)候就是無(wú)序的,因?yàn)镸ap并沒(méi)有存儲(chǔ)上一個(gè)Key-Value的地址,所以并不能保證數(shù)據(jù)打印出來(lái)是有序的。就跟java一樣,HashMap也是無(wú)序的,有序的LinkedHashMap也是封裝之后的。

2018年4月15日 22:03
編輯回答
薔薇花

map本身就是無(wú)序的,你需要的大致可以用list套map

2017年10月12日 01:00
編輯回答
囍槑

別聽(tīng)他們扯,這是golang的諸多不足甚至缺陷之一。以后肯定會(huì)調(diào)整,但是目前階段只能不用map。

2017年3月31日 23:48
編輯回答
傲寒

嗯,用list.

2018年2月19日 20:31
編輯回答
孤毒

把map的value存儲(chǔ)成一個(gè)list

2017年11月20日 20:42
編輯回答
撿肥皂

用list存吧,存入什么順序 輸入就是什么順序,map的機(jī)制就是這樣

2017年10月8日 16:18
編輯回答
大濕胸

這個(gè)是map的機(jī)制,map存儲(chǔ)數(shù)據(jù)本身是沒(méi)有一定順序的,每次遍歷map可能順序都不一樣。

2018年5月18日 07:12
編輯回答
茍活

額,如果只是為了打印而打印,為什么不這樣呢?

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

跟團(tuán)游?去哪國(guó)的,人均多少啊:)

2017年6月4日 20:40