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

 更新时间:2022年06月10日 09:46:28   作者:王中阳Go  
这篇文章主要介绍了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())
}

输出结果如下:

下面介绍常用的方法 🔽

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

输出结果:

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

输出结果:

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

输出结果:

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

输出结果:

总结

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

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

相关文章

  • GO语言的map类型实例详解

    GO语言的map类型实例详解

    这篇文章主要介绍了GO语言的map类型实例详解,包括对map的创建,赋值,排序,删除,等操作需要的朋友可以参考下
    2022-12-12
  • Go语言的代码组织结构详细介绍

    Go语言的代码组织结构详细介绍

    这篇文章主要介绍了Go语言的代码码组织结构详细介绍,即Go语言源码的文件结构,本文讲解了包、main和main.main、os包等内容,需要的朋友可以参考下
    2014-10-10
  • Go语言底层原理互斥锁的实现原理

    Go语言底层原理互斥锁的实现原理

    这篇文章主要介绍了Go语言底层原理互斥锁的实现原理,Go sync包提供了两种锁类型,分别是互斥锁sync.Mutex和读写互斥锁sync.RWMutex,都属于悲观锁,更多相关内容需要的朋友可以查看下面文章内容
    2022-08-08
  • Golang 中的json.Marshal问题总结(推荐)

    Golang 中的json.Marshal问题总结(推荐)

    这篇文章主要介绍了Golang中的json.Marshal问题总结,本文通过一个例子给大家详细讲解,本次提出的问题中,我们不难注意到其中的time.Time是一个匿名(Anonymous)字段,而这个就是答案的由来,需要的朋友可以参考下
    2022-06-06
  • Go Wails开发桌面应用使用示例探索

    Go Wails开发桌面应用使用示例探索

    这篇文章主要为大家介绍了Go Wails的使用示例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go基本数据类型与string类型互转

    Go基本数据类型与string类型互转

    本文主要介绍了Go基本数据类型与string类型互转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang fmt占位符的使用详解

    golang fmt占位符的使用详解

    这篇文章主要介绍了golang fmt占位符的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 实用的Go语言开发工具及使用示例

    实用的Go语言开发工具及使用示例

    这篇文章主要为大家介绍了实用的Go语言开发工具及使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 理解Go流程控制与快乐路径原则

    理解Go流程控制与快乐路径原则

    这篇文章主要为大家介绍了Go流程控制与快乐路径原则的原理解析,
    有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言MessageBox用法实例

    Go语言MessageBox用法实例

    这篇文章主要介绍了Go语言MessageBox用法,实例分析了MessageBox提示框的实现与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02

最新评论