Go 之基礎速學 (十七) golang 裡面空介面使用,型別斷言,range

huxiaobai_001發表於2020-05-22
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 協議》,轉載必須註明作者和本文連結

胡軍

相關文章