GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗(yàn)
前言
今天在搞一個(gè)需求,從三方獲得有信息變更的商品,更新自己的數(shù)據(jù)庫,再推送給下游進(jìn)行商品更新。
期間有更新商品數(shù)量不確定,為了保證程序穩(wěn)定性,每組向下游推送20個(gè)商品id。
查了garray的文檔,發(fā)現(xiàn)支持Chunk()方法,灰常好用。
func commonSendMessage(goodsIds *garray.IntArray, messageType int) { goodsIdsChunk := goodsIds.Chunk(20) for _, chunkedGoodsIds := range goodsIdsChunk { //給下游推送消息 message.SendMessage(chunkedGoodsIds, messageType, 0) //商品變動(dòng)appid為0 } }
于是,決定今天分享 GoFrame garray的開箱體驗(yàn)
普通數(shù)組
package main import ( "fmt" "github.com/gogf/gf/v2/container/garray" ) func main() { // 創(chuàng)建并發(fā)安全的int類型數(shù)組 a := garray.NewIntArray(true) // 添加數(shù)據(jù)項(xiàng) for i := 0; i < 10; i++ { a.Append(i) } // 獲取當(dāng)前數(shù)組長度 fmt.Println(a.Len()) // 獲取當(dāng)前數(shù)據(jù)項(xiàng)列表 fmt.Println(a.Slice()) // 獲取指定索引項(xiàng) fmt.Println(a.Get(6)) // 在指定索引后插入數(shù)據(jù)項(xiàng) a.InsertAfter(9, 11) // 在指定索引前插入數(shù)據(jù)項(xiàng) a.InsertBefore(10, 10) fmt.Println(a.Slice()) // 修改指定索引的數(shù)據(jù)項(xiàng) a.Set(0, 100) fmt.Println(a.Slice()) // 搜索數(shù)據(jù)項(xiàng),返回搜索到的索引位置 fmt.Println(a.Search(5)) // 刪除指定索引的數(shù)據(jù)項(xiàng) a.Remove(0) fmt.Println(a.Slice()) // 并發(fā)安全,寫鎖操作 a.LockFunc(func(array []int) { // 將末尾項(xiàng)改為100 array[len(array)-1] = 100 }) // 并發(fā)安全,讀鎖操作 a.RLockFunc(func(array []int) { fmt.Println(array[len(array)-1]) }) // 清空數(shù)組 fmt.Println(a.Slice()) a.Clear() fmt.Println(a.Slice()) }
輸出結(jié)果如下:
下面介紹常用的方法 ??
Append
說明:向數(shù)組的尾部追加數(shù)據(jù),可以添加任意數(shù)量字符串。Append的方法是PushRight的別名
格式:
Append(value ...string) *StrArray
示例:建立一個(gè)空數(shù)組,設(shè)置完數(shù)據(jù)后,并在數(shù)組尾部添加新的數(shù)據(jù)。
package main import ( "fmt" "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/frame/g" ) func main() { s := garray.NewStrArray() s.SetArray(g.SliceStr{"We", "are", "GF", "fans"}) s.Append("王", "中", "陽") fmt.Println(s) }
輸出結(jié)果:
At
說明:返回?cái)?shù)組指定索引的數(shù)據(jù)
格式:
At(index int) (value string)
示例:建立一個(gè)數(shù)組,找到index為2的數(shù)據(jù)。
func ExampleStrArray_At() { s := garray.NewStrArrayFrom(g.SliceStr{"We", "are", "GF", "fans", "!"}) sAt := s.At(2) fmt.Println(sAt) }
輸出結(jié)果:
GF
Chunk
說明:把指定數(shù)組按指定的大小Size,分割成多個(gè)數(shù)組,返回值為[][]string。最后一個(gè)數(shù)組包含數(shù)據(jù)的數(shù)量可能小于Size
格式:
Chunk(size int) [][]string
示例:建立一個(gè)數(shù)組,并將該數(shù)組分割成3個(gè)數(shù)組。
func ExampleStrArray_Chunk() { s := garray.NewStrArrayFrom(g.SliceStr{"a", "b", "c", "d", "e", "f", "g", "h"}) r := s.Chunk(3) fmt.Println(r) }
輸出結(jié)果:
[[a b c] [d e f] [g h]]
Clear
說明:刪除當(dāng)前數(shù)組中所有的數(shù)據(jù)
格式:
Clear() *StrArray
示例:建立一個(gè)空數(shù)組,賦值后,并刪除該數(shù)組的數(shù)據(jù)。
func ExampleStrArray_Clear() { s := garray.NewStrArray() s.SetArray(g.SliceStr{"a", "b", "c", "d", "e", "f", "g", "h"}) fmt.Println(s) fmt.Println(s.Clear()) fmt.Println(s) }
輸出結(jié)果:
Clone
說明:克隆當(dāng)前的數(shù)組。返回一個(gè)與當(dāng)前數(shù)組相同的數(shù)組拷貝
格式:
Clone() (newArray *StrArray)
示例:建立一個(gè)空數(shù)組,賦值后,克隆出一個(gè)新數(shù)組。
func ExampleStrArray_Clone() { s := garray.NewStrArray() s.SetArray(g.SliceStr{"a", "b", "c", "d", "e", "f", "g", "h"}) r := s.Clone() fmt.Println(r) fmt.Println(s) }
輸出結(jié)果:
PopLefts
說明:從數(shù)組的左側(cè)將多個(gè)字符串?dāng)?shù)據(jù)出棧,返回值為出棧的字符串?dāng)?shù)據(jù),出棧數(shù)據(jù)的個(gè)數(shù)為size。如果size比數(shù)組的size大,那么方法將返回?cái)?shù)組中所有的數(shù)據(jù)。如果size<=0或者為空,那么將返回nil
格式:
PopLefts(size int) []string
示例:建立1個(gè)新數(shù)組,將最左邊的2個(gè)數(shù)據(jù)做出棧操作,并打印出出棧的數(shù)據(jù)和原數(shù)組的剩余數(shù)據(jù)
func ExampleStrArray_PopLefts() { s := garray.NewStrArray() s.SetArray(g.SliceStr{"a", "b", "c", "d", "e", "f", "g", "h"}) r := s.PopLefts(2) fmt.Println(r) fmt.Println(s) }
輸出結(jié)果:
總結(jié)
好了,garray的使用就先介紹到這里,是不是和PHP的array非常像,感覺框架的作者之前一定寫過PHP,哈哈。
以上就是GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于GoFrame garray并發(fā)安全數(shù)組的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
分析Go語言中CSP并發(fā)模型與Goroutine的基本使用
我們都知道并發(fā)是提升資源利用率最基礎(chǔ)的手段,尤其是當(dāng)今大數(shù)據(jù)時(shí)代,流量對(duì)于一家互聯(lián)網(wǎng)企業(yè)的重要性不言而喻。串流顯然是不行的,尤其是對(duì)于web后端這種流量的直接載體。并發(fā)是一定的,問題在于怎么執(zhí)行并發(fā)。常見的并發(fā)方式有三種,分別是多進(jìn)程、多線程和協(xié)程2021-06-06Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式
本文主要介紹了Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式,通過三種方式實(shí)現(xiàn)增刪改查的操作,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Go語言中關(guān)閉帶緩沖區(qū)的頻道實(shí)例分析
這篇文章主要介紹了Go語言中關(guān)閉帶緩沖區(qū)的頻道,實(shí)例分析了帶緩沖區(qū)頻道的原理與用法,以及關(guān)閉帶緩沖區(qū)頻道的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Golang 實(shí)現(xiàn) Redis系列(六)如何實(shí)現(xiàn) pipeline 模式的 redis 客戶端
pipeline 模式的 redis 客戶端需要有兩個(gè)后臺(tái)協(xié)程負(fù)責(zé) tcp 通信,調(diào)用方通過 channel 向后臺(tái)協(xié)程發(fā)送指令,并阻塞等待直到收到響應(yīng),本文是使用 golang 實(shí)現(xiàn) redis 系列的第六篇, 將介紹如何實(shí)現(xiàn)一個(gè) Pipeline 模式的 Redis 客戶端。2021-07-07使用go語言解析xml的實(shí)現(xiàn)方法(必看篇)
下面小編就為大家?guī)硪黄褂胓o語言解析xml的實(shí)現(xiàn)方法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06GoFrame?gtree樹形結(jié)構(gòu)的使用技巧示例
這篇文章主要為大家介紹了GoFrame?gtree樹形結(jié)構(gòu)的使用技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06