package main
import (
_ "com.huxiaobai/servicesa"
"database/sql" "fmt" _ "github.com/go-sql-driver/mysql"
"github.com/pquerna/ffjson/ffjson")
//main函式是入口函式 不能有引數 也不能有返回值
func main(){
db,err := sql.Open("mysql","root:root@tcp(localhost:3306)/cs?charset=utf8mb4")
if err != nil{
fmt.Println("連結錯誤"+err.Error())
return
}
//db.query()表示執行原生sql語句 也是返回兩個值 rows結果集 error發生錯誤時候會返回
rows,error := db.Query("select gonghao,xingming from user limit 2")
if error != nil{
fmt.Println("查詢錯誤"+error.Error())
return
}
//現在我們再通過空介面型別的形式再配合上切片來獲取資料 因為你不知道查詢出來的欄位的型別都有哪些 所以直接用空介面來代替會更好一些
//allRows := make([]interface{},0)
//for rows.Next(){
// var uid int
// var uname string
// rows.Scan(&uid,&uname)
// //oneRow := make([]interface{},2)
// //oneRow[0] = uid
// //oneRow[1] = uname
// //allRows = append(allRows,oneRow)
// //上邊這些可以用下邊一句話來代替了 可以理解為oneRow := []interface{}{uid,uname} 只不過是用 []interface{}{uid,uname}代替了oneRow而已
// allRows = append(allRows,[]interface{}{uid,uname})
//}
//fmt.Println(allRows)
//在我們再通過空介面型別的形式再配合上切片來獲取資料
//比如上邊的哪裡 我們是規定了uid uname 如果欄位非常多的話我們不可能把所有的欄位都寫出來包括型別 所以我們可以給allRows總體的集合定義為空介面型別 然後裡面的每個oneRow也定義為空介面型別 這樣你就不用把所有的引數都寫出來了
allRows := make([]interface{},0)
for rows.Next(){
oneRow := make([]interface{},2)
rows.Scan(&oneRow[0],&oneRow[1])
//你會發現oneRow裡面都是看不懂的數字
//for i:=0;i<len(oneRow);i++{
// fmt.Println(oneRow[i])
//}
//可以通過range內建函式來遍歷oneRow i表示下標 val表示的值 然後對val值通過string強制轉換為能看到的文字 然後再append到allRows大的集合當中去
for i,val := range oneRow{
//型別斷言 其實就是判斷型別的 v,ok:=val.(T) T表示型別 如果val是T這個型別 那麼ok就是true 你要使用v這個值繼續後邊的操作 那麼看不懂的數字其實就是[]byte切片型別
v,ok:=val.([]byte)
if(ok){
oneRow[i] = string(v)
}
}
allRows = append(allRows,oneRow)
}
result,err := json.Marshal(allRows)
fmt.Println(string(result))
}
直接上程式碼吧,我們前邊將的案例當中將結果集都整到struct結構體當中去了,但是你在結構體當中得要定義uid,uname等欄位還得設定型別比較麻煩,我們這裡講的是以空介面的形式來搞,因為空介面當中可以存放任何形式的資料,你就不用定義各個欄位並且還得定義型別了,會比較通用一些!
並且案例當中涉及到了型別斷言以及range函式的使用
本作品採用《CC 協議》,轉載必須註明作者和本文連結