Golang数组操作 - garray

文章来源:https://goframe.org/container/garray/index

garray

数组容器,提供普通数组,及排序数组,支持数据项唯一性矫正,支持可选的并发安全参数控制。

使用场景

数组操作。

使用方式

import "github.com/gogf/gf/g/container/garray"

接口文档

https://godoc.org/github.com/gogf/gf/g/container/garray

func New(unsafe ...bool) *Array
func NewArray(unsafe ...bool) *Array
func NewArrayFrom(array []interface{}, unsafe ...bool) *Array
func NewArrayFromCopy(array []interface{}, unsafe ...bool) *Array
func NewArraySize(size int, cap int, unsafe ...bool) *Array
func NewFrom(array []interface{}, unsafe ...bool) *Array
func NewFromCopy(array []interface{}, unsafe ...bool) *Array
func (a *Array) Append(value ...interface{}) *Array
func (a *Array) Chunk(size int) [][]interface{}
func (a *Array) Clear() *Array
func (a *Array) Clone() (newArray *Array)
func (a *Array) Contains(value interface{}) bool
func (a *Array) CountValues() map[interface{}]int
func (a *Array) Fill(startIndex int, num int, value interface{}) *Array
func (a *Array) Get(index int) interface{}
func (a *Array) InsertAfter(index int, value interface{}) *Array
func (a *Array) InsertBefore(index int, value interface{}) *Array
func (a *Array) Join(glue string) string
func (a *Array) Len() int
func (a *Array) LockFunc(f func(array []interface{})) *Array
func (a *Array) Merge(array interface{}) *Array
func (a *Array) Pad(size int, val interface{}) *Array
func (a *Array) PopLeft() interface{}
func (a *Array) PopLefts(size int) []interface{}
func (a *Array) PopRand() interface{}
func (a *Array) PopRands(size int) []interface{}
func (a *Array) PopRight() interface{}
func (a *Array) PopRights(size int) []interface{}
func (a *Array) PushLeft(value ...interface{}) *Array
func (a *Array) PushRight(value ...interface{}) *Array
func (a *Array) RLockFunc(f func(array []interface{})) *Array
func (a *Array) Rand() interface{}
func (a *Array) Rands(size int) []interface{}
func (a *Array) Range(start, end int) []interface{}
func (a *Array) Remove(index int) interface{}
func (a *Array) Replace(array []interface{}) *Array
func (a *Array) Reverse() *Array
func (a *Array) Search(value interface{}) int
func (a *Array) Set(index int, value interface{}) *Array
func (a *Array) SetArray(array []interface{}) *Array
func (a *Array) Shuffle() *Array
func (a *Array) Slice() []interface{}
func (a *Array) SortFunc(less func(v1, v2 interface{}) bool) *Array
func (a *Array) String() string
func (a *Array) SubSlice(offset, size int) []interface{}
func (a *Array) Sum() (sum int)
func (a *Array) Unique() *Array

由于garray模块下的对象及方法较多,支持int/string/interface{}三种数据类型,这里便不一一列举。garray下包含了多种数据类型的slice,可以使用 garray.New*Array/garray.NewSorted*Array 方法来创建,其中garray.New*Array为普通不排序数组,garray.NewSorted*Array为排序数组(当创建interface{}类型的数组时,创建时可以指定自定义的排序函数)。

使用示例1,普通数组

package main

import (
    "fmt"
    "github.com/gogf/gf/g/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())
}

执行后,输出结果为:

10
[0 1 2 3 4 5 6 7 8 9]
6
[0 1 2 3 4 5 6 7 8 9 10 11]
[100 1 2 3 4 5 6 7 8 9 10 11]
5
[1 2 3 4 5 6 7 8 9 10 11]
100
[1 2 3 4 5 6 7 8 9 10 100]
[]

使用示例2,排序数组

排序数组的方法与普通数组类似,但是带有自动排序功能及唯一性过滤功能。

package main

import (
    "fmt"
    "github.com/gogf/gf/g/container/garray"
)


func main () {
    // 自定义排序数组,降序排序(SortedIntArray管理的数据是升序)
    a := garray.NewSortedArray(func(v1, v2 interface{}) int {
        if v1.(int) < v2.(int) {
            return 1
        }
        if v1.(int) > v2.(int) {
            return -1
        }
        return 0
    })

    // 添加数据
    a.Add(2)
    a.Add(3)
    a.Add(1)
    fmt.Println(a.Slice())

    // 添加重复数据
    a.Add(3)
    fmt.Println(a.Slice())

    // 检索数据,返回最后对比的索引位置,检索结果
    // 检索结果:0: 匹配; <0:参数小于对比值; >0:参数大于对比值
    fmt.Println(a.Search(1))

    // 设置不可重复
    a.SetUnique(true)
    fmt.Println(a.Slice())
    a.Add(1)
    fmt.Println(a.Slice())
}

执行后,输出结果:

[3 2 1]
[3 3 2 1]
3 0
[3 2 1]
[3 2 1]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,110评论 0 18
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,421评论 1 45
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,863评论 6 13
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 1,957评论 0 3
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 1,143评论 1 0