溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

發(fā)布時(shí)間:2022-06-13 10:36:10 來(lái)源:億速云 閱讀:175 作者:zzz 欄目:開發(fā)技術(shù)

今天小編給大家分享一下GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

garray特點(diǎn)簡(jiǎn)介

  • garray支持int/string/interface{}三種常用的數(shù)據(jù)類型。

  • garray支持普通數(shù)組和排序數(shù)組,普通數(shù)組的結(jié)構(gòu)體名稱定義為Array格式,排序數(shù)組的結(jié)構(gòu)體名稱定義為SortedArray格式,如下:Array, intArray, StrArray,SortedArray, SortedIntArray, SortedStrArray

  • 其中排序數(shù)組SortedArray,需要給定排序比較方法,在工具包gutil中也定義了很多ComparatorXXX的比較方法,用起來(lái)很方便。當(dāng)然也支持自定義排序方式。

基本使用

package main

import (
   "fmt"
   "github.com/gogf/gf/container/garray"
)

func main() {
   //創(chuàng)建并發(fā)安全的int型數(shù)組
   a := garray.NewIntArray(true)
   //添加數(shù)組項(xiàng)
   for i := 0; i < 10; i++ {
      a.Append(i)
   }
   // 打印結(jié)果:
   fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9]"

   fmt.Println("數(shù)組長(zhǎng)度:", a.Len())
   fmt.Println("數(shù)組的值:", a.Slice())
   fmt.Println((a.Get(5))) //根據(jù)索引取值 返回值和是否取到了值 5 true

   // 在指定索引前后插入值
   _ = a.InsertAfter(9, 10)
   _ = a.InsertBefore(0, -1)
   fmt.Println(a.Slice())

   // 搜索數(shù)據(jù)項(xiàng),返回對(duì)應(yīng)的索引
   fmt.Println("搜索值,返回對(duì)應(yīng)索引:", a.Search(5))

   // 刪除
   a.Remove(0)
   fmt.Println(a.Slice())

   // 并發(fā)安全 寫鎖操作
   a.LockFunc(func(array []int) {
      //將最后一項(xiàng)的值改為100
      array[len(array)-1] = 100
   })
   fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9,100]"
   
   // 并發(fā)安全 讀鎖操作
   a.RLockFunc(func(array []int) {
      fmt.Println(array[len(array)-1]) //100
   })

   // 清空數(shù)組
   a.Clear()
   fmt.Println("清空數(shù)組之后:", a.Slice())
}

打印結(jié)果

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

數(shù)組出棧

  • 數(shù)組出棧使用Pop*關(guān)鍵字

  • 數(shù)組可以按順序出棧,而gf提供的另外一個(gè)數(shù)據(jù)類型gmap的pop*方法是隨機(jī)出棧 (關(guān)注我,會(huì)在后續(xù)的文章中更新說(shuō)明)

  • garray中隨機(jī)出棧,我們可以使用rand()或者popRand()

package main

import (
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)

//數(shù)組出棧 pop 數(shù)組可以按順序出棧 map的pop是隨機(jī)出棧
func main() {
   a := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6})
   fmt.Println(a.PopLeft())
   fmt.Println(a.PopLefts(2))
   fmt.Println(a.PopRight())
   fmt.Println(a.PopRights(2))
   fmt.Println(a) //全部出棧后 數(shù)組為空
   /**
   打印結(jié)果:
   1 true
   [2 3]
   6 true
   [4 5]
   []
   */

   // 有什么辦法能像map一樣隨機(jī)出棧呢? 在garray中我們使用rand()或者popRand()
   a1 := garray.NewFrom(g.Slice{1, 2, 3, 4, 5, 6, 7})
   fmt.Println("----------")
   fmt.Println(a1.Rand())      //隨機(jī)取值
   fmt.Println(a1.PopRands(2)) //隨機(jī)出棧
   fmt.Println(a1)

}

包含判斷

  • 注意:Contains()是區(qū)分大小寫

  • 空值過(guò)濾使用:FilterEmpty

  • nil過(guò)濾使用:FilterNil

package main

import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)

//包含 contains 區(qū)分大小寫
func main() {
   var a garray.Array
   a.Append("a")
   g.Dump(a.Contains("a")) //true
   g.Dump(a.Contains("A")) //false

   // 空值過(guò)濾
   a1 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中陽(yáng)"})
   a2 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中陽(yáng)"})
   g.Dump("empty過(guò)濾:", a1.FilterEmpty()) //empty過(guò)濾:"[1,2,"王中陽(yáng)"]"
   g.Dump("nil過(guò)濾:", a2.FilterNil())     //nil過(guò)濾:"[0,1,2,"false","[]","王中陽(yáng)"]"

   a3 := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7})

   g.Dump("數(shù)組翻轉(zhuǎn):", a3.Reverse())

   g.Dump("數(shù)組隨機(jī)排序:", a3.Shuffle())
}

打印結(jié)果

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

排序數(shù)組

  • 我們可以自定義NewSortedArray的排序規(guī)則,以實(shí)現(xiàn)是升序數(shù)組還是降序數(shù)組;

  • 排序數(shù)組還有唯一性校驗(yàn)的功能:garray.SetUnique(true)

  • gf框架的gutil工具包定義好了常用的排序規(guī)則

package main

import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gutil"
)

//我們可以自定義NewSortedArray的排序規(guī)則,以實(shí)現(xiàn)是升序數(shù)組還是降序數(shù)組;排序數(shù)組還有唯一性校驗(yàn)的功能
func main() {
   //自定義排序數(shù)組:降序排列
   a := garray.NewSortedArray(func(a, b interface{}) int {
      if a.(int) < b.(int) {
         return 1
      }
      if a.(int) > b.(int) {
         return -1
      }
      return 0
   })
   // 排序規(guī)格可以使用gutil中定義好的
   a.Add(2) //數(shù)組的賦值用add map的賦值用set
   a.Add(1)
   a.Add(3)
   g.Dump("a:", a) //打印結(jié)果:"[3,2,1]"

   //升序數(shù)組
   a2 := garray.NewSortedArray(gutil.ComparatorInt)
   a2.Add(2)
   a2.Add(1)
   a2.Add(3)
   g.Dump("a2:", a2)
   // 添加重復(fù)元素
   a2.Add(2)
   g.Dump("a2添加重復(fù)元素后:", a2)
   a2.SetUnique(true) //設(shè)置不允許重復(fù)元素
   g.Dump("a2設(shè)置不允許重復(fù)元素之后:", a2)
}

打印結(jié)果

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

join、chunk、merge

  • 數(shù)據(jù)項(xiàng)串聯(lián)是相當(dāng)常用的場(chǎng)景,比如多個(gè)id以逗號(hào)分隔入庫(kù)存儲(chǔ),我們使用join關(guān)鍵字即可

  • garray支持將一個(gè)數(shù)組拆分成指定數(shù)量的二維數(shù)組,使用chunk關(guān)鍵字

  • garray支持使用merge關(guān)鍵字合并數(shù)組

package main

import (
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)

func main() {
   //join 串聯(lián) 常用于逗號(hào)分割
   a := garray.NewFrom(g.Slice{1, 2, 3, 4, 5})
   fmt.Println("串聯(lián)結(jié)果:", a.Join("_")) //1_2_3_4_5

   //數(shù)組拆分 chunk
   fmt.Println("數(shù)組拆分:", a.Chunk(2)) //[[1 2] [3 4] [5]]

   // 數(shù)組合并 可以合并數(shù)組 也可以合并slice(原生切片和g.Slice都支持)
   a1 := garray.NewFrom(g.Slice{1, 2})
   a2 := garray.NewFrom(g.Slice{3, 4})
   s1 := g.Slice{5, 6}
   s2 := []string{"7", "8"}
   s3 := []int{9, 0}
   a1.Merge(a2)
   a1.Merge(s1)
   a1.Merge(s2)
   a1.Merge(s3)
   fmt.Println("合并結(jié)果:", a1) // [1,2,3,4,5,6,7,8,9,0]
}

打印結(jié)果:

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

遍歷

  • garray天然支持升序遍歷和降序遍歷

  • 函數(shù)Iterator()是IteratorAsc()的別名

package main

import (
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)

//數(shù)組遍歷 iterate
func main() {
   a := garray.NewFrom(g.Slice{"a", "b", "c"})
   fmt.Println("升序遍歷結(jié)果")
   a.Iterator(func(k int, v interface{}) bool {
      fmt.Printf("%v,%v \n", k, v)
      return true
   })

   // 數(shù)組倒序遍歷
   fmt.Println("倒序遍歷結(jié)果:")
   a.IteratorDesc(func(k int, v interface{}) bool {
      fmt.Printf("%v,%v \n", k, v)
      return true
   })
}

打印結(jié)果

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

遍歷修改 walk函數(shù)

非常好用?。?!

看到這個(gè)方法,更堅(jiān)信了我一個(gè)觀點(diǎn):GF的作者一定寫了幾年P(guān)HP。

package main

import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gconv"
)

//walk遍歷修改 修改數(shù)組的值
func main() {
   var a garray.Array
   tables := g.Slice{"user", "user_detail"}
   a.Append(tables...)
   prefix := "gf_"
   a.Walk(func(value interface{}) interface{} {
      return prefix + gconv.String(value)
   })
   g.Dump(a)
}

打印結(jié)果

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

序列化和反序列化

這里重點(diǎn)提一下:gf container容器包下的對(duì)象都實(shí)現(xiàn)對(duì)原生json包的支持,都支持序列化和反序列化。

打印結(jié)果

GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)

以上就是“GoFrame框架garray對(duì)比PHP的array有什么優(yōu)勢(shì)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI