Go 之基础速学 (十七) golang 里面空接口使用,类型断言,range

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 协议》,转载必须注明作者和本文链接

胡军

huxiaobai_001
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!