GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)_第1頁(yè)
GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)_第2頁(yè)
GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)_第3頁(yè)
GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)_第4頁(yè)
GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第GoFrame框架garray對(duì)比PHP的array優(yōu)勢(shì)目錄初識(shí)GoFramegarray特點(diǎn)簡(jiǎn)介基本使用數(shù)組出棧包含判斷排序數(shù)組join、chunk、merge遍歷遍歷修改walk函數(shù)序列化和反序列化總結(jié)寫過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比較像(不固定長(zhǎng)度、引用類型、動(dòng)態(tài)擴(kuò)容等),但是在開發(fā)使用中遠(yuǎn)遠(yuǎn)不像PHP的array靈活。

初識(shí)GoFrame

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

近期已經(jīng)更新了一系列GoFrame的文章,下文將GoFrame簡(jiǎn)稱為gf。感興趣的同學(xué)可以關(guān)注我的專欄:Go語(yǔ)言學(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)然也支持自定義排序方式。

基本使用

packagemain

import(

"fmt"

"/gogf/gf/container/garray"

funcmain(){

//創(chuàng)建并發(fā)安全的int型數(shù)組

a:=garray.NewIntArray(true)

//添加數(shù)組項(xiàng)

fori:=0;ii++{

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ù)索引取值返回值和是否取到了值5true

//在指定索引前后插入值

_=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)鍵字?jǐn)?shù)組可以按順序出棧,而gf提供的另外一個(gè)數(shù)據(jù)類型gmap的pop*方法是隨機(jī)出棧(關(guān)注我,會(huì)在后續(xù)的文章中更新說明)garray中隨機(jī)出棧,我們可以使用rand()或者popRand()

packagemain

import(

"fmt"

"/gogf/gf/container/garray"

"/gogf/gf/frame/g"

//數(shù)組出棧pop數(shù)組可以按順序出棧map的pop是隨機(jī)出棧

funcmain(){

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

1true

[23]

6true

[45]

//有什么辦法能像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ū)分大小寫空值過濾使用:FilterEmptynil過濾使用:FilterNil

packagemain

import(

"/gogf/gf/container/garray"

"/gogf/gf/frame/g"

//包含contains區(qū)分大小寫

funcmain(){

varagarray.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{},"王中陽(yáng)"})

a2:=garray.NewFrom([]interface{}{0,1,"2",nil,false,g.Slice{},"王中陽(yáng)"})

g.Dump("empty過濾:",a1.FilterEmpty())//empty過濾:"[1,2,"王中陽(yáng)"]"

g.Dump("nil過濾:",a2.FilterNil())//nil過濾:"[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é)果

排序數(shù)組

我們可以自定義NewSortedArray的排序規(guī)則,以實(shí)現(xiàn)是升序數(shù)組還是降序數(shù)組;排序數(shù)組還有唯一性校驗(yàn)的功能:garray.SetUnique(true)gf框架的gutil工具包定義好了常用的排序規(guī)則

packagemain

import(

"/gogf/gf/container/garray"

"/gogf/gf/frame/g"

"/gogf/gf/util/gutil"

//我們可以自定義NewSortedArray的排序規(guī)則,以實(shí)現(xiàn)是升序數(shù)組還是降序數(shù)組;排序數(shù)組還有唯一性校驗(yàn)的功能

funcmain(){

//自定義排序數(shù)組:降序排列

a:=garray.NewSortedArray(func(a,binterface{})int{

ifa.(int)b.(int){

return1

ifa.(int)b.(int){

return-1

return0

//排序規(guī)格可以使用gutil中定義好的

a.Add(2)//數(shù)組的賦值用addmap的賦值用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)分隔入庫(kù)存儲(chǔ),我們使用join關(guān)鍵字即可garray支持將一個(gè)數(shù)組拆分成指定數(shù)量的二維數(shù)組,使用chunk關(guān)鍵字garray支持使用merge關(guān)鍵字合并數(shù)組

packagemain

import(

"fmt"

"/gogf/gf/container/garray"

"/gogf/gf/frame/g"

funcmain(){

//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))//[[12][34][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()的別名

packagemain

import(

"fmt"

"/gogf/gf/container/garray"

"/gogf/gf/frame/g"

//數(shù)組遍歷iterate

funcmain(){

a:=garray.NewFrom(g.Slice{"a","b","c"})

fmt.Println("升序遍歷結(jié)果")

a.Iterator(func(kint,vinterface{})bool{

fmt.Printf("%v,%v\n",k,v)

returntrue

//數(shù)組倒序遍歷

fmt.Println("倒序遍歷結(jié)果:")

a.IteratorDesc(func(kint,vinterface{})bool{

fmt.Printf("%v,%v\n",k,v)

returntrue

打印結(jié)果

遍歷修改walk函數(shù)

非常好用?。?!

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

packagemain

import(

"/gogf/gf/container/garray"

"/gogf/gf/frame/g"

"/gogf/gf/util/gconv"

//walk遍歷修改修改數(shù)組的值

funcmain(){

varagarray.Array

table

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論