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