func HttpFileHandler4(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") db, e := sql.Open("mysql", "root:1234@tcp(localhost:3306)/mysql?charset=utf8") if e != nil { //如果连接出错,e将不是nil的 print("ERROR?") return } // 提醒一句, 运行到这里, 并不代表数据库连接是完全OK的, 因为发送第一条SQL才会校验密码 汗~! _, e2 := db.Query("select 1") if e2 == nil { println("DB OK") ttt,err := db.Exec("USE stock") if err != nil { print("ERROR?") return } fmt.Print(ttt) rows, e := db.Query("SELECT date,open,high,low,close,volume FROM `2015tw`;") if e != nil { fmt.Print("query error!!%v\n", e) return } fmt.Print(rows) if rows == nil { print("Rows is nil") return } var first int first=0 fmt.Fprintln(w,"[") for rows.Next() { //跟java的ResultSet一样,需要先next读取 if first!=0{ if rows.Next()!=false{ fmt.Fprintln(w,",") } } if first==0{ first=1 } stock := new(Stock) // rows貌似只支持Scan方法 继续汗~! 当然,可以通过GetColumns()来得到字段顺序 row_err := rows.Scan(&stock.Date,&stock.Open,&stock.High,&stock.Low,&stock.Close,&stock.Volume) if row_err != nil { //print("Row error!!") fmt.Fprintln(w,"]") return } fmt.Fprint(w,"[") tm2, _ := time.Parse("2006-01-02 15:04:05", strings.Replace(getFieldString(stock, "Date"), "/", "-", 2)+" 00:00:00") //fmt.Println(fmt.Sprint((int64(tm2.Unix())))) //fmt.Print(int32(tm2.Unix())) //fmt.Println(strings.Replace(getFieldString(stock, "Date"), "/", "-", 2)+" 00:00:00") //fmt.Print(int32(tm2.Unix())) fmt.Fprint(w,fmt.Sprint((int64(tm2.Unix()*1000)))+",")比照 fmt.Fprint(w,getFieldString(stock, "Open")+",") fmt.Fprint(w,getFieldString(stock, "High")+",") fmt.Fprint(w,getFieldString(stock, "Low")+",") fmt.Fprint(w,getFieldString(stock, "Close")+",") fmt.Fprint(w,getFieldString(stock, "Volume")) fmt.Fprintln(w,"]") // fmt.Fprintln(w,checkCount(&rows)) // b, _ := json.Marshal(stock) // fmt.Println(string(b)) // 这里没有判断错误, 呵呵, 一般都不会有错吧 //fmt.Fprint(w,string(b)) } fmt.Fprintln(w,"]") } }