最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年06月11日 11:21:43   作者:王中陽Go  
這篇文章主要為大家介紹了GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

寫過PHP的同學(xué)都知道 PHP的數(shù)組Array非常好用,特別靈活。

我在寫PHP之前使用Java做安卓開發(fā),在接觸PHP的數(shù)組Array之后,直呼太香了!

而在學(xué)習(xí)Go基礎(chǔ)知識(shí)的時(shí)候了解到Go的數(shù)組和PHP的數(shù)組并不一樣;從一定程度上講,Go的slice切片類型和PHP的數(shù)組array比較像(不固定長度、引用類型、動(dòng)態(tài)擴(kuò)容等),但是在開發(fā)使用中遠(yuǎn)遠(yuǎn)不像PHP的array靈活。

初識(shí)GoFrame

最近在使用基于Go語言的GoFrame框架擼項(xiàng)目,發(fā)現(xiàn)GoFrame封裝的garray竟然比PHP的array還要好用。

近期已經(jīng)更新了一系列GoFrame的文章,下文將GoFrame簡(jiǎn)稱為gf。感興趣的同學(xué)可以關(guān)注我的專欄:Go語言學(xué)習(xí)專欄 ,目前已經(jīng)更新了86篇原創(chuàng)文章,獲得了176位同學(xué)的關(guān)注。

gf框架有個(gè)特點(diǎn),提供的組件基本都支持設(shè)置并發(fā)安全開關(guān)。顯然PHP是不支持并發(fā)安全開關(guān)的,PHP的數(shù)組是并發(fā)安全的。PHP-FPM是阻塞的單線程模型,PHP-FPM每個(gè)進(jìn)程里只有一個(gè)線程,一個(gè)進(jìn)程同時(shí)只能服務(wù)一個(gè)客戶端。

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的比較方法,用起來很方便。當(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ù)組長度:", 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é)果

數(shù)組出棧

  • 數(shù)組出棧使用Pop*關(guān)鍵字
  • 數(shù)組可以按順序出棧,而gf提供的另外一個(gè)數(shù)據(jù)類型gmap的pop*方法是隨機(jī)出棧 (關(guān)注我,會(huì)在后續(xù)的文章中更新說明)
  • 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ū)分大小寫
  • 空值過濾使用:FilterEmpty
  • nil過濾使用: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
   // 空值過濾
   a1 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中陽"})
   a2 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中陽"})
   g.Dump("empty過濾:", a1.FilterEmpty()) //empty過濾:"[1,2,"王中陽"]"
   g.Dump("nil過濾:", a2.FilterNil())     //nil過濾:"[0,1,2,"false","[]","王中陽"]"
   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é)果

排序數(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é)果

join、chunk、merge

  • 數(shù)據(jù)項(xiàng)串聯(lián)是相當(dāng)常用的場(chǎng)景,比如多個(gè)id以逗號(hào)分隔入庫存儲(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é)果:

遍歷

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é)果

遍歷修改 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é)果

序列化和反序列化

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

gf非常重視對(duì)序列化的支持,Go學(xué)習(xí)專欄 文章中介紹了gmap、glist、gqueue、gset、gtree...等gf組件,都是支持序列化和反序列化的。

打印結(jié)果

總結(jié)

綜上我們了解到:

  • garray支持設(shè)置并發(fā)安全開關(guān)
  • 支持排序數(shù)組
  • 支持?jǐn)?shù)組出棧、包含判斷、join、chunk、merge等常用的工具方法
  • 天然支持升序遍歷、遍歷修改
  • 天然支持序列化和反序列化

大家是不是明顯感覺到GoFrame的garray比PHP的array還要好用。

更加堅(jiān)信GoFrame的作者是寫過PHP的

以上就是GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)的詳細(xì)內(nèi)容,更多關(guān)于GoFrame框架garray優(yōu)勢(shì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言中排序的3種實(shí)現(xiàn)方法

    Go語言中排序的3種實(shí)現(xiàn)方法

    在寫代碼過程中,排序是經(jīng)常會(huì)遇到的需求,這篇文章主要為大家介紹三種常用的方法,文中的示例代碼簡(jiǎn)潔易懂,需要的小伙伴可以參考下
    2023-08-08
  • Go語言判斷文件或文件夾是否存在的方法

    Go語言判斷文件或文件夾是否存在的方法

    這篇文章主要介紹了Go語言判斷文件或文件夾是否存在的方法,結(jié)合具體實(shí)例形式對(duì)比分析了Go語言針對(duì)文件與目錄判斷的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • go語言中os包的用法實(shí)戰(zhàn)大全

    go語言中os包的用法實(shí)戰(zhàn)大全

    Go在os中提供了文件的基本操作,包括通常意義的打開、創(chuàng)建、讀寫等操作,除此以外為了追求便捷以及性能上,Go還在io/ioutil以及bufio提供一些其他函數(shù)供開發(fā)者使用,這篇文章主要給大家介紹了關(guān)于go語言中os包用法的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • Go語言封裝MinIO相關(guān)操作詳解

    Go語言封裝MinIO相關(guān)操作詳解

    MinIO?是一個(gè)高性能的對(duì)象存儲(chǔ)服務(wù),兼容?Amazon?S3?API,廣泛用于存儲(chǔ)和管理海量數(shù)據(jù),本文將介紹如何用?Go?語言封裝一個(gè)簡(jiǎn)單的?MinIO?操作包,需要的可以參考下
    2024-11-11
  • golang 實(shí)現(xiàn)比特幣內(nèi)核之處理橢圓曲線中的天文數(shù)字

    golang 實(shí)現(xiàn)比特幣內(nèi)核之處理橢圓曲線中的天文數(shù)字

    比特幣密碼學(xué)中涉及到的大數(shù)運(yùn)算超出常規(guī)整數(shù)范圍,需使用golang的big包進(jìn)行處理,通過使用big.Int類型,能有效避免整數(shù)溢出,并保持邏輯正確性,測(cè)試展示了在不同質(zhì)數(shù)模下的運(yùn)算結(jié)果,驗(yàn)證了邏輯的準(zhǔn)確性,此外,探討了費(fèi)馬小定理在有限字段除法運(yùn)算中的應(yīng)用
    2024-11-11
  • Go?并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情

    Go?并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情

    這篇文章主要介紹了Go并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情,協(xié)程是Go語言最大的特色之一,goroutine的實(shí)現(xiàn)其實(shí)是通過協(xié)程,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • Golang使用channel實(shí)現(xiàn)數(shù)據(jù)匯總的方法詳解

    Golang使用channel實(shí)現(xiàn)數(shù)據(jù)匯總的方法詳解

    這篇文章主要為大家詳細(xì)介紹了在并發(fā)編程中數(shù)據(jù)匯總的問題,并探討了在并發(fā)環(huán)境下使用互斥鎖和通道兩種方式來保證數(shù)據(jù)安全性的方法,需要的可以參考一下
    2023-05-05
  • 詳解Golang中Context的三個(gè)常見應(yīng)用場(chǎng)景

    詳解Golang中Context的三個(gè)常見應(yīng)用場(chǎng)景

    Golang?context主要用于定義超時(shí)取消,取消后續(xù)操作,在不同操作中傳遞值。本文通過簡(jiǎn)單易懂的示例進(jìn)行說明,感興趣的可以了解一下
    2022-12-12
  • Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼

    Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼

    本文主要介紹了Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Go GORM版本2.0新特性介紹

    Go GORM版本2.0新特性介紹

    這篇文章主要為大家介紹了Go GORM版本2.0新特性的使用示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

晋城| 香河县| 顺昌县| 无棣县| 临猗县| 怀远县| 天全县| 同德县| 乾安县| 宁国市| 芜湖县| 洪泽县| 大同县| 台中县| 昌江| 贺兰县| 娱乐| 河南省| 阿拉善右旗| 馆陶县| 西安市| 彩票| 页游| 慈溪市| 贵南县| 南江县| 宜兴市| 梅河口市| 五河县| 定边县| 苏州市| 曲松县| 靖安县| 日喀则市| 友谊县| 米易县| 丽水市| 佛冈县| 喀喇沁旗| 正阳县| 旺苍县|