php随机数组-GoFrame 字段比 PHP 字段更容易使用! ?

2023-08-29 0 1,808 百度已收录

前言

写过PHP的朋友都知道,PHP的字段Array非常好用,而且非常灵活。

在写PHP之前,我是用Java做Android开发的。 当我接触到PHP的字段数组php随机数组,我惊呼太美味了!

在学习Go基础知识的时候,我了解到Go的字段和PHP的字段不一样; 某种程度上,Go的切片类型类似于PHP的字段数组(不固定宽度、引用类型、动态扩展等),在开发和使用上远不如PHP的数组灵活。

第一次接触 GoFrame

最近在使用基于Go语言的GoFrame框架项目,发现GoFrame封装的gararray甚至比PHP数组更好用。

最近更新了一系列GoFrame文章,下面将GoFrame简称为gf。 感兴趣的朋友可以关注我的专栏:Go语言学习专栏,目前已经更新了120多篇原创文章,获得了700多位同事的关注。

gf框架有一个特点,提供的组件基本上都支持设置并发安全开关。 事实上,PHP不支持并发安全开关,而PHP字段是并发安全的。 PHP-FPM 是阻塞单线程模型。 PHP-FPM的每个进程只有一个线程php随机数组,一个进程一次只能服务一个客户端。

Garray功能介绍

Gararray支持三种常用的数据类型:int/string/interface{}。

Garray 支持普通链表和排序字段。 普通链表的结构名以Array格式定义,排序字段的结构名以SortedArray格式定义,如下:Array、intArray、StrArray、SortedArray、SortedIntArray、SortedStrArray

其中,排序字段SortedArray需要给出排序比较方法,工具包gutil中也定义了很多ComparatorXXX比较方法,使用起来非常方便。 事实上,还支持自定义排序方法。

基本使用

package main

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

func main() {
   //创建并发安全的int型数组
   a := garray.NewIntArray(true)
   //添加数组项
   for i := 0; i < 10; i++ {
      a.Append(i)
   }
   // 打印结果:
   fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9]"

   fmt.Println("数组长度:", a.Len())
   fmt.Println("数组的值:", a.Slice())
   fmt.Println((a.Get(5))) //根据索引取值 返回值和是否取到了值 5 true

   // 在指定索引前后插入值
   _ = a.InsertAfter(910)
   _ = a.InsertBefore(0-1)
   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
   })
   fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9,100]"
   
   // 并发安全 读锁操作
   a.RLockFunc(func(array []int) {
      fmt.Println(array[len(array)-1]) //100
   })

   // 清空数组
   a.Clear()
   fmt.Println("清空数组之后:", a.Slice())
}

复制结果

现场流行音乐

字段弹出使用 Pop* 关键字

链表可以按顺序出栈,gf提供的另一种数据类型gmap的pop*方法是随机出栈的(关注我,后续文章会更新说明)

garray中随机出栈,我们可以使用rand()或popRand()

package main

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

//数组出栈 pop 数组可以按顺序出栈 map的pop是随机出栈
func main() {
   a := garray.NewFrom([]interface{}{123456})
   fmt.Println(a.PopLeft())
   fmt.Println(a.PopLefts(2))
   fmt.Println(a.PopRight())
   fmt.Println(a.PopRights(2))
   fmt.Println(a) //全部出栈后 数组为空
   /**
   打印结果:
   1 true
   [2 3]
   6 true
   [4 5]
   []
   */


   // 有什么办法能像map一样随机出栈呢? 在garray中我们使用rand()或者popRand()
   a1 := garray.NewFrom(g.Slice{1234567})
   fmt.Println("----------")
   fmt.Println(a1.Rand())      //随机取值
   fmt.Println(a1.PopRands(2)) //随机出栈
   fmt.Println(a1)

}

包含判断

注意:Contains() 区分大小写

空值过滤使用:FilterEmpty

php随机数组-GoFrame 字段比 PHP 字段更容易使用!  ?

nil 过滤器使用:FilterNil

package main

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

//包含 contains 区分大小写
func main() {
   var a garray.Array
   a.Append("a")
   g.Dump(a.Contains("a")) //true
   g.Dump(a.Contains("A")) //false

   // 空值过滤
   a1 := garray.NewFrom([]interface{}{01"2"nilfalse, g.Slice{}, "王中阳"})
   a2 := garray.NewFrom([]interface{}{01"2"nilfalse, g.Slice{}, "王中阳"})
   g.Dump("empty过滤:", a1.FilterEmpty()) //empty过滤:"[1,2,"王中阳"]"
   g.Dump("nil过滤:", a2.FilterNil())     //nil过滤:"[0,1,2,"false","[]","王中阳"]"

   a3 := garray.NewFrom([]interface{}{1234567})

   g.Dump("数组翻转:", a3.Reverse())

   g.Dump("数组随机排序:", a3.Shuffle())
}

复制结果

排序字段

我们可以自定义NewSortedArray的排序规则来实现是反向链表还是反向链表;

排序字段还有唯一性校准的功能:garbage.SetUnique(true)

gf框架的gutil工具包定义了常用的排序规则

package main

import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gutil"
)

//我们可以自定义NewSortedArray的排序规则,以实现是升序数组还是降序数组;排序数组还有唯一性校验的功能
func main() {
   //自定义排序数组:降序排列
   a := garray.NewSortedArray(func(a, b interface{}) int {
      if a.(int) < b.(int) {
         return 1
      }
      if a.(int) > b.(int) {
         return -1
      }
      return 0
   })
   // 排序规格可以使用gutil中定义好的
   a.Add(2//数组的赋值用add map的赋值用set
   a.Add(1)
   a.Add(3)
   g.Dump("a:", a) //打印结果:"[3,2,1]"

   //升序数组
   a2 := garray.NewSortedArray(gutil.ComparatorInt)
   a2.Add(2)
   a2.Add(1)
   a2.Add(3)
   g.Dump("a2:", a2)
   // 添加重复元素
   a2.Add(2)
   g.Dump("a2添加重复元素后:", a2)
   a2.SetUnique(true//设置不允许重复元素
   g.Dump("a2设置不允许重复元素之后:", a2)
}

复制结果

php随机数组-GoFrame 字段比 PHP 字段更容易使用!  ?

连接、分块、合并

数据项的串联是一种非常常见的场景。 例如,多个id用冒号分隔并存储在数据库中。 我们可以使用 join 关键字

Garray支持将链表分割成指定数量的二维链表,使用chunk关键字

Garray 支持使用 merge 关键字合并链表

package main

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

func main() {
   //join 串联 常用于逗号分割
   a := garray.NewFrom(g.Slice{12345})
   fmt.Println("串联结果:", a.Join("_")) //1_2_3_4_5

   //数组拆分 chunk
   fmt.Println("数组拆分:", a.Chunk(2)) //[[1 2] [3 4] [5]]

   // 数组合并 可以合并数组 也可以合并slice(原生切片和g.Slice都支持)
   a1 := garray.NewFrom(g.Slice{12})
   a2 := garray.NewFrom(g.Slice{34})
   s1 := g.Slice{56}
   s2 := []string{"7""8"}
   s3 := []int{90}
   a1.Merge(a2)
   a1.Merge(s1)
   a1.Merge(s2)
   a1.Merge(s3)
   fmt.Println("合并结果:", a1) // [1,2,3,4,5,6,7,8,9,0]
}

复制结果:

遍历

Garray天然支持反向遍历和反向遍历

函数 Iterator() 是 IteratorAsc() 的另一个名称

package main

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

//数组遍历 iterate
func main() {
   a := garray.NewFrom(g.Slice{"a""b""c"})
   fmt.Println("升序遍历结果")
   a.Iterator(func(k int, v interface{}) bool {
      fmt.Printf("%v,%v n", k, v)
      return true
   })

   // 数组倒序遍历
   fmt.Println("倒序遍历结果:")
   a.IteratorDesc(func(k int, v interface{}) bool {
      fmt.Printf("%v,%v n", k, v)
      return true
   })
}

复制结果

横移变行走功能

非常容易使用! ! !

听到这里,我更加确信自己的观点了:GF的作者肯定写了好几年PHP了。

package main

import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gconv"
)

//walk遍历修改 修改数组的值
func main() {
   var a garray.Array
   tables := g.Slice{"user""user_detail"}
   a.Append(tables...)
   prefix := "gf_"
   a.Walk(func(value interface{}) interface{} {
      return prefix + gconv.String(value)
   })
   g.Dump(a)
}

复制结果

序列化和反序列

这里有一点需要提一下:gfcontainer容器包下的对象都支持原生json包,并且都支持序列化和反序列化。

gf 特别注重对序列化的支持。 Go学习专栏介绍了gf组件如gmap、glist、gqueue、gset、gtree等,它们都支持序列化和反序列化。

package main

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

//gf container容器包下的对象都实现对原生json包的支持,即都支持序列化和反序列化
func main() {
   //序列化
   type student struct {
      Name   string
      Age    int
      Scores *garray.IntArray
   }
   s := student{
      Name:   "王中阳",
      Age:    28,
      Scores: garray.NewIntArrayFrom([]int{10098}),
   }

   bytes, _ := json.Marshal(s)
   g.Dump(bytes) //{"Name":"王中阳","Age":28,"Scores":[100,98]}

   //反序列化
   data := []byte(`{"Name":"王中阳","Age":28,"Scores":[100,98]}`)
   s2 := student{}
   _ = json.Unmarshal(data, &s2)
   fmt.Println(s2) //{王中阳 28 [100,98]}
}

复制结果

总结

综上所述,我们了解到:

Garray支持设置并发安全开关

支持字段排序

支持字段弹出、包含判断、join、chunk、merge等常用工具方法。

天然支持反向遍历和遍历变化

对序列化和反序列化的本机支持

是不是明显感觉GoFrame的garray比PHP的数组好用一些。

越来越相信GoFrame的作者写的是PHP

一起学习、升级、打怪

我们创建了一个对学习Go确实有帮助的小组,欢迎加入:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php随机数组-GoFrame 字段比 PHP 字段更容易使用! ? https://www.wkzy.net/game/170340.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务