第十三篇:查询返回通用数组、空接口使用、类型断言、range
引言:上一篇我们是返回一个UserModel切片,但是这个太有"针对性“,假设我们要做个数据库工具类,不可能都返回指定的Model,
这个时候我们要做一个通用的返回值
一:空接口了解下:
type all interface{
}
任何类型都可以是空接口(因为它里面什么都"没有")
var i all=models.UserModel{}
var i all=123
var i all="abc"
如果不给它赋值,它里面每一项不会初始化为0或者"",而是nil
也可以定义匿名空接口如下:
//var i interface{}//<nil>
var i interface{}="123"
fmt.Println(i)
上篇代码进行优化:
(1):尝试把定义的空接口干成切片
type all interface {
}
func main(){
var list=make([]all,2)
fmt.Println(list)//[<nil> <nil>]
}
事实上,我们都没必要去定义一个all空接口结构,可以使用以下方式
var list=make([]interface{},2)//空切片,切片类型为空接口,空接口可以为任意类型
fmt.Println(list)//[<nil> <nil>]
/*
var list=make([]interface{},2)
list[0]=222
list[1]="abc"
fmt.Println(list)//[222 abc]
*/
(2):代码优化
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, _ := sql.Open("mysql",
"账号:密码@tcp(ip:3306)/数据库?charset=utf8mb4")
rows, _ := db.Query("select id,nick_name from xcx_user where id<=20 and id>16")
/*定义一个空接口切片
有了空接口类型之后,我们就可以对相关的数据库取值的时候尼,
就不需要写明字段是什么类型(数据库里有些字段是int类型,有些字段是string类型)
*/
allRows := make([]interface{}, 0) //这是我们的所有行,长度不知道暂时写0就可以了
for rows.Next() {
//第一种写法假设我们已经知道取出的字段数据类型
var uid int
var uname string
rows.Scan(&uid, &uname)
/* 执行完rows.Scan(&uid,&uname)之后,我们定义的
var uid int var uname string就有值了
*/
oneRow := make([]interface{}, 2) //循环的单独的一行,有两列,长度为2;
oneRow[0] = uid
oneRow[1] = uname
allRows = append(allRows, oneRow) //把循环的每一行塞到所有行里
}
fmt.Println(allRows) //[[17 #汪] [18 曹雅芬] [19 AAA_黄飞] [20 123]]
}
其中循环部分也可以写成如下方式:

(3):继续优化(上述代码如果取出的字段比较多,循环遍历的时候就需要定义许多字段,比较麻烦)



浙公网安备 33010602011771号