第十三篇:查询返回通用数组、空接口使用、类型断言、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):继续优化(上述代码如果取出的字段比较多,循环遍历的时候就需要定义许多字段,比较麻烦)

 

 

 

 

 

 

 

 

  

  

posted @ 2020-06-09 18:00  痞子胥  阅读(247)  评论(0)    收藏  举报