Go 之基础速学 (十六) golang 里面的 slice 切片 查询返回实际集合
在第15节当中我们是通过struct结构体的形式来获取的mysql查询的结果集,但是存在的问题就是循环完结构体里面就只剩下最后一条记录的值在结构体元素当中保存下来,如何才能将所有的结果集整合到一个集合当中去呢?今天我们来研究一下slice切片技术
我们先来看一下如何通过slice切片技术返回结果集到一个结合当中去 直接上代码:
package main import ( "com.huxiaobai/models" _ "com.huxiaobai/servicesa" "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/pquerna/ffjson/ffjson") //main函数是入口函数 不能有参数 也不能有返回值 func main(){ db err 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 } //现在我们再通过切片的形式来获取数据 //定义一个slice切片 userModels := []models.UserModel{} for rows.Next(){ //每循环一次相当于重新赋值一个新的结构体给temp temp := models.UserModel{} //通过Scan()扫描将值赋值到结构体的属性当中去 rows.Scan(&temp.Uid,&temp.Uname) //然后通过append追加到切片slice userModels里面去了 userModels=append(userModels,temp) } //现在我们可以通过ffjson第三方包的函数去对userModels进行json化转化 ret,_ := ffjson.Marshal(userModels) //转化出来的json是肉眼看不懂的数字 所以需要通过string进行强制转换一下 fmt.Println(string(ret)) //另外现在你就可以通过读取切片slice里面的下标 然后在获取到结构体里面的元素的值了 //fmt.Println(userModels[0].Uname) //现在你就可以通过读取切片slice里面的下标 然后在获取到结构体里面的元素的值了 fmt.Println(userModels[0].Uname) }
现在我们再来看一些slice切片的零碎的知识点总结:
package main import ( "com.huxiaobai/models" "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/pquerna/ffjson/ffjson") //main函数是入口函数 不能有参数 也不能有返回值 func main(){ //slice切片的学习 案例一 //[5]stirng{"a","b","c"} 有数值的是数组 下边这个就是一个数组 记住 数据一旦定义好长度是不能改变的 //arr := [5]string{"a","b","c"} //fmt.Println(arr) //[]string{"a","b","c"} 没有数值的就是切片 下边就是一个切片 并且是带值初始化的切片 //a := []string{"z","y","x"} //fmt.Println(a, len(a),cap(a)) //不带值初始化的切片案例 //var s []int //此时的s的len和cap都是0 //s = make([]int,5) //需要make一下 相当于给slice切片分配空间和初始化长度 //fmt.Println(s,len(s),cap(s)) //不带值初始化切片案例 也是对上边案例的一种简化写法 //ss := make([]int,5) //ss[4] 这个4是在5的范围内 这样写是没错的 但是如果是ss[6] = 666 那么就会报错 因为超出了范围 但是它是切片啊 不跟数组一样规定是5就只能5个元素 切片是可以扩展的 该咋办呢? //ss[4] = 444 //这么办 ss = append(ss,5,6,7) //使用append()函数添加数据 当原有的切片容量不足的时候会再创建一个切片slice,把原有的slice切片拷贝进去,因此实际开发要预估一个很是的cap,否则会导致性能的开销 //ss = append(ss,5,6,7) //fmt.Println(ss,len(ss),cap(ss)) //从数组当中获取转变成一个切片案例一 c是一个数组 d就是一个切片 d会复制c的容量 //c := [5]int{1,2,3,4,5} //d := c[0:2] //[4,10) >=4 <10 d是个切片 他会复制c的容量 //fmt.Println(d,len(d),cap(d)) //从数组当中获取转变成一个切片案例二 ww是一个数组 y就是一个切片 y会复制ww的容量 //ww := [5]int{1,2,3,4,5} //y := ww[0:2] //y = append(y,3,4,5,6,7) //fmt.Println(y,len(y),cap(y)) }
重点还是去看代码里面的注释吧 里面写的很清楚了已经
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: