Go 之基礎速學 (十六) golang 裡面的 slice 切片 查詢返回實際集合

huxiaobai_001發表於2020-05-21

在第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)
   }
  //現在你就可以通過讀取切片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 協議》,轉載必須註明作者和本文連結

胡軍

相關文章