脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - GoFrame框架garray并发安全数组使用开箱体验

GoFrame框架garray并发安全数组使用开箱体验

2022-10-17 11:13王中阳Go Golang

这篇文章主要介绍了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())
}

输出结果如下:

GoFrame框架garray并发安全数组使用开箱体验

下面介绍常用的方法

 

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

输出结果:

GoFrame框架garray并发安全数组使用开箱体验

 

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

输出结果:

GoFrame框架garray并发安全数组使用开箱体验

 

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

输出结果:

GoFrame框架garray并发安全数组使用开箱体验

 

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

输出结果:

GoFrame框架garray并发安全数组使用开箱体验

 

总结

好了,garray的使用就先介绍到这里,是不是和PHP的array非常像,感觉框架的作者之前一定写过PHP,哈哈。

以上就是GoFrame框架garray并发安全数组使用开箱体验的详细内容,更多关于GoFrame garray并发安全数组的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7090901734247104548

延伸 · 阅读

精彩推荐
  • Golang深入理解go缓存库freecache的使用

    深入理解go缓存库freecache的使用

    go开发缓存场景一般使用map或者缓存框架,为了线程安全会使用sync.Map或线程安全的缓存框架,本文就详细的介绍了go缓存库freecache,感兴趣的可以了解一下...

    luoxn285602022-09-03
  • Golang用go gin server来做文件上传服务

    用go gin server来做文件上传服务

    今天小编就为大家分享一篇关于用go gin server来做文件上传服务,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编...

    stpeace3192020-05-25
  • Golanggolang如何用type-switch判断interface变量的实际存储类型

    golang如何用type-switch判断interface变量的实际存储类型

    这篇文章主要介绍了golang如何用type-switch判断interface变量的实际存储类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    做一只会飞的象3462022-04-14
  • Golang解决Golang json序列化字符串时多了\的情况

    解决Golang json序列化字符串时多了\的情况

    这篇文章主要介绍了解决Golang json序列化字符串时多了\的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Go哥10412021-03-22
  • Golanggo语言匿名函数的使用

    go语言匿名函数的使用

    今天小编就为大家分享一篇关于go语言匿名函数的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    itdada4042020-05-25
  • Golang详解Golang Iris框架的基本使用

    详解Golang Iris框架的基本使用

    这篇文章主要介绍了Golang Iris框架的基本使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...

    WillAlso9962021-02-07
  • Golang多阶段构建优化Go 程序Docker镜像

    多阶段构建优化Go 程序Docker镜像

    这篇文章主要为大家介绍了多阶段构建优化Go 程序Docker镜像,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    龚国玮4972022-08-20
  • GolangGolang 处理浮点数遇到的精度问题(使用decimal)

    Golang 处理浮点数遇到的精度问题(使用decimal)

    本文主要介绍了Golang 处理浮点数遇到的精度问题,不使用decimal会出大问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们...

    头秃猫轻王4022022-09-04