




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高精度稱重傳感器企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 禮品包裝塑料容器行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 鈦白粉的可行性研究報(bào)告
- 醫(yī)用玻璃制品投資項(xiàng)目可行性分析
- 福建省福州市八縣(市)一中2020-2021學(xué)年高二上學(xué)期期末聯(lián)考地理含答案
- 年產(chǎn)一萬噸飼料廠建設(shè)項(xiàng)目可行性研究報(bào)告好
- DB62T 4161-2020 金露梅、銀露梅播種育苗技術(shù)規(guī)程
- 保護(hù)裝置改造可行性研究報(bào)告
- 高校心理健康教育職責(zé)與實(shí)踐
- 學(xué)校安全應(yīng)急組織及職責(zé)
- 環(huán)境及理化因素?fù)p傷-凍傷
- Unit7SeasonPartALetslearn(教學(xué)設(shè)計(jì))閩教版英語(yǔ)四年級(jí)下冊(cè)
- 世界文化遺產(chǎn)武當(dāng)山古建筑群的資料
- 醫(yī)院醫(yī)療設(shè)備采購(gòu)項(xiàng)目HIS系統(tǒng)及硬件采購(gòu)?fù)稑?biāo)文件
- 【橡膠工藝】-橡膠產(chǎn)品生產(chǎn)工藝規(guī)程
- 推銷實(shí)戰(zhàn)技巧與客戶優(yōu)秀服務(wù)技巧
- 福建新費(fèi)用定額交底材料
- 器質(zhì)性精神障礙患者的護(hù)理
- 木魚湖濕地公園景觀設(shè)計(jì)
- A0409涉密人員變更審批表
- 五防系統(tǒng)調(diào)試報(bào)告
評(píng)論
0/150
提交評(píng)論