GoFrame garray使用实践

简介: 今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。

前言


今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。

期间有更新商品数量不确定,为了保证程序稳定性,每组向下游推送20个商品id。

查了garray的文档,发现支持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的开箱体验


普通数组


package main
import (
   "fmt"
   "github.com/gogf/gf/v2/container/garray"
)
func main() {
   // 创建并发安全的int类型数组
   a := garray.NewIntArray(true)
   // 添加数据项
   for i := 0; i < 10; i++ {
      a.Append(i)
   }
   // 获取当前数组长度
   fmt.Println(a.Len())
   // 获取当前数据项列表
   fmt.Println(a.Slice())
   // 获取指定索引项
   fmt.Println(a.Get(6))
   // 在指定索引后插入数据项
   a.InsertAfter(9, 11)
   // 在指定索引前插入数据项
   a.InsertBefore(10, 10)
   fmt.Println(a.Slice())
   // 修改指定索引的数据项
   a.Set(0, 100)
   fmt.Println(a.Slice())
   // 搜索数据项,返回搜索到的索引位置
   fmt.Println(a.Search(5))
   // 删除指定索引的数据项
   a.Remove(0)
   fmt.Println(a.Slice())
   // 并发安全,写锁操作
   a.LockFunc(func(array []int) {
      // 将末尾项改为100
      array[len(array)-1] = 100
   })
   // 并发安全,读锁操作
   a.RLockFunc(func(array []int) {
      fmt.Println(array[len(array)-1])
   })
   // 清空数组
   fmt.Println(a.Slice())
   a.Clear()
   fmt.Println(a.Slice())
}


输出结果如下:


微信图片_20221112190301.jpg


下面介绍常用的方法  🔽

Append


说明:向数组的尾部追加数据,可以添加任意数量字符串。Append的方法是PushRight的别名

格式:


Append(value ...string) *StrArray


示例:建立一个空数组,设置完数据后,并在数组尾部添加新的数据。


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)
}


输出结果:


微信图片_20221112190305.jpg


At


说明:返回数组指定索引的数据

格式:


At(index int) (value string)


示例:建立一个数组,找到index为2的数据。


func ExampleStrArray_At() {
    s := garray.NewStrArrayFrom(g.SliceStr{"We", "are", "GF", "fans", "!"})
    sAt := s.At(2)
    fmt.Println(sAt)
}


输出结果:GF


Chunk


说明:把指定数组按指定的大小Size,分割成多个数组,返回值为[][]string。最后一个数组包含数据的数量可能小于Size

格式:


Chunk(size int) [][]string


示例:建立一个数组,并将该数组分割成3个数组


func ExampleStrArray_Chunk() {
    s := garray.NewStrArrayFrom(g.SliceStr{"a", "b", "c", "d", "e", "f", "g", "h"})
    r := s.Chunk(3)
    fmt.Println(r) 
}


输出结果:[[a b c] [d e f] [g h]]


Clear


说明:删除当前数组中所有的数据

格式:


Clear() *StrArray


示例:建立一个空数组,赋值后,并删除该数组的数据。


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)
}


输出结果:


微信图片_20221112190308.jpg


Clone


说明:克隆当前的数组。返回一个与当前数组相同的数组拷贝

格式:


Clone() (newArray *StrArray)


示例:建立一个空数组,赋值后,克隆出一个新数组。


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)
}


输出结果:


微信图片_20221112190311.jpg


PopLefts


说明:从数组的左侧将多个字符串数据出栈,返回值为出栈的字符串数据,出栈数据的个数为size。如果size比数组的size大,那么方法将返回数组中所有的数据。如果size<=0或者为空,那么将返回nil

格式:


PopLefts(size int) []string


示例:建立1个新数组,将最左边的2个数据做出栈操作,并打印出出栈的数据和原数组的剩余数据


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)
}


输出结果:


微信图片_20221112190315.jpg

相关文章
|
5月前
|
SQL 存储 NoSQL
数据库原理速览:核心知识集萃与复习指南
数据库原理速览:核心知识集萃与复习指南
48 2
|
5月前
|
编解码 网络协议 Java
技术笔记:Mina框架(实战详解)
技术笔记:Mina框架(实战详解)
|
6月前
|
Java 编译器 Go
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(一)
本文主要梳理自第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲)。
176 1
|
6月前
|
NoSQL Redis
goFrame v2.6 gredis 报错
goFrame v2.6 gredis 报错问题解决
171 0
|
存储 JavaScript Linux
开源 Golang 微服务入门二:RPC 框架 Kitex| 青训营笔记
Kitex 字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选
296 0
开源 Golang 微服务入门二:RPC 框架 Kitex| 青训营笔记
|
负载均衡 网络协议 Dubbo
卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架
什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC...
|
编解码 运维 负载均衡
深入浅出RPC框架|青训营笔记
由于课程涉及到的RPC知识需要自己对其有较为全面的理解后才能比较好的get到课程中提及的各种框架设计的点,因此我建议阅读Kitex框架的源码,再结合课程目录去体会Kitex设计的初衷。
188 0
深入浅出RPC框架|青训营笔记
|
自然语言处理 Go
Go语言编程快速入门
Go语言编程快速入门
113 0
|
监控 数据可视化 安全
pprof性能调优实战|青训营笔记
本次课程讲解大体分为两个部分:讲述高质量编码的规范和性能调优实战,这篇文章侧重于复现使用pprof工具性能调优的实践过程,而第一部分则希望大家各自归纳总结。
231 0
pprof性能调优实战|青训营笔记