GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗
前言
今天在搞一個需求,從三方獲得有信息變更的商品,更新自己的數(shù)據(jù)庫,再推送給下游進(jìn)行商品更新。
期間有更新商品數(shù)量不確定,為了保證程序穩(wěn)定性,每組向下游推送20個商品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) //商品變動appid為0
}
}
于是,決定今天分享 GoFrame garray的開箱體驗
普通數(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ù)項
for i := 0; i < 10; i++ {
a.Append(i)
}
// 獲取當(dāng)前數(shù)組長度
fmt.Println(a.Len())
// 獲取當(dāng)前數(shù)據(jù)項列表
fmt.Println(a.Slice())
// 獲取指定索引項
fmt.Println(a.Get(6))
// 在指定索引后插入數(shù)據(jù)項
a.InsertAfter(9, 11)
// 在指定索引前插入數(shù)據(jù)項
a.InsertBefore(10, 10)
fmt.Println(a.Slice())
// 修改指定索引的數(shù)據(jù)項
a.Set(0, 100)
fmt.Println(a.Slice())
// 搜索數(shù)據(jù)項,返回搜索到的索引位置
fmt.Println(a.Search(5))
// 刪除指定索引的數(shù)據(jù)項
a.Remove(0)
fmt.Println(a.Slice())
// 并發(fā)安全,寫鎖操作
a.LockFunc(func(array []int) {
// 將末尾項改為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
示例:建立一個空數(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
說明:返回數(shù)組指定索引的數(shù)據(jù)
格式:
At(index int) (value string)
示例:建立一個數(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,分割成多個數(shù)組,返回值為[][]string。最后一個數(shù)組包含數(shù)據(jù)的數(shù)量可能小于Size
格式:
Chunk(size int) [][]string
示例:建立一個數(shù)組,并將該數(shù)組分割成3個數(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
示例:建立一個空數(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ù)組。返回一個與當(dāng)前數(shù)組相同的數(shù)組拷貝
格式:
Clone() (newArray *StrArray)
示例:建立一個空數(shù)組,賦值后,克隆出一個新數(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è)將多個字符串?dāng)?shù)據(jù)出棧,返回值為出棧的字符串?dāng)?shù)據(jù),出棧數(shù)據(jù)的個數(shù)為size。如果size比數(shù)組的size大,那么方法將返回數(shù)組中所有的數(shù)據(jù)。如果size<=0或者為空,那么將返回nil
格式:
PopLefts(size int) []string
示例:建立1個新數(shù)組,將最左邊的2個數(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ù)組使用開箱體驗的詳細(xì)內(nèi)容,更多關(guān)于GoFrame garray并發(fā)安全數(shù)組的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON
本文主要介紹了Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
golang框架中跨服務(wù)的最佳通信協(xié)議和工具
在 go 框架中實現(xiàn)跨服務(wù)通信的最佳實踐包括使用 grpc(適用于低延遲高吞吐量)、http 客戶端(適用于 restful api)和消息隊列(適用于異步解耦通信),在選擇通信方式時,應(yīng)考慮服務(wù)交互模式、性能要求和部署環(huán)境等因素2024-06-06

