GoFrame框架gset使用对比PHP Java Redis优势

目录
  • 特点
  • 使用入门
  • 对比PHP和Java
    • PHP
    • JAVA
    • GO原生
    • GoFrame
  • 延伸

这篇文章将会为大家介绍GoFrame gset使用入门,为了让大家更好的理解,会简明扼要的分析一下集合类型Set的特点,对比一下Java、PHP、原生Go对集合Set类型的支持情况,如果不支持Set类型,我们如何找到解决方案,来实现元素不可重复性和交差并补集的需求。

特点

集合gset:一组不可重复的元素,元素可以是任何类型

上一篇文章介绍的: GoFrame的garray为什么比PHP的array还好用? garray的排序数组也可以通过设置SetUnique(true),设置元素不可重复的特性。

使用入门

  • 支持设置并发安全的开关
  • 批量添加元素时,注意传参:切片后要加上... 即把切片打散之后添加
  • Size() 获得集合大小
  • Contains() 判断是否包含指定值
  • Remove() 移除元素
  • 支持使用Iterator遍历
  • 可以通过 集合.String() ,一键将集合转成字符串
  • 通过 集合.LockFunc() 实现并发安全写操作
  • 通过 集合.RLockFunc() 实现并发安全读操作
  • Clear() 清空集合
package main
import (
   "fmt"
   "github.com/gogf/gf/container/gset"
)
func main() {
   //创建一个并发安全的集合对象
   s := gset.New(true)
   //添加数据
   s.Add(1)
   // 批量添加数据
   s.Add([]interface{}{2, 3, 4, 5}...) //注意 这里要用... 即把切片打散之后添加
   // 打印结果
   fmt.Println(s)
   fmt.Println("集合的大小:", s.Size())
   fmt.Println("集合的大小:", s.Size())
   fmt.Println("集合中是否包含某个值:", s.Contains(5))
   fmt.Println("集合中是否包含某个值:", s.Contains(10))
   fmt.Println("返回数据项:", s.Slice())
   s.Remove(1) //删除的是数据项 不是根据索引删除
   fmt.Println("remove删除数据项之后:", s)
   // 遍历
   s.Iterator(func(v interface{}) bool {
      fmt.Println("遍历结果:", v)
      return true
   })
   // 集合转字符串
   fmt.Println("集合转字符串:", s.String())
   // 并发安全写锁操作
   s.LockFunc(func(m map[interface{}]struct{}) {
      m[6] = struct{}{}
   })
   // 并发安全读锁操作
   s.RLockFunc(func(m map[interface{}]struct{}) {
      fmt.Println("并发安全读锁操作:", m)
   })
   // 清空集合
   s.Clear()
   fmt.Println("清空集合后:", s)
}

打印结果

对比PHP和Java

PHP

PHP是没有Set数据类型的,set关键字作为一个赋值函数使用。在PHP中,__set()方法可以用于为私有成员属性设置值,给一个未定义的属性赋值时会被触发;

使用Set一个非常重要的场景就是使用交差并补集;之前用PHP开发项目时,我们是使用Redis的Set来实现交差并补集需求的。

JAVA

在Java中,是有Set类型的:存取无序,元素唯一。

GO原生

Go原生也是不提供Set类型的,但是GoFrame为我们提供了gset类型。

GoFrame

我们可以基于gset实现不可重复元素的需求,当然,如果是Java转Go的同学,使用gset应该会更加得心应手。

延伸

下图是Go原生提供的数据类型,让我们确信go原生并未支持set类型,但是支持Map类型。

而Map的key不能有重复值,当我们使用Go原生开发时,如果要实现不可重复元素的需求可以使用Map的这一特性。

Go原生开发要实现交差并补集,一样可以像我们一样,使用Redis的集合set,Redis还支持有序集合(sorted set)。

以上就是GoFrame框架gset使用对比PHP Java Redis优势的详细内容,更多关于GoFrame框架gset优势的资料请关注我们其它相关文章!

(0)

相关推荐

  • GoFrame gmap遍历hashmap listmap treemap使用技巧

    目录 先说结论 map类型 使用技巧 基础概念 对比sync.Map 基础使用 合并 merge 序列化 过滤空值 键值对反转 Flip 出栈(随机出栈) 总结 文章比较硬核,爆肝2千多字,除了hashmap.listmap.treemap使用技巧阅读还有使用gmap的踩坑之旅,阅读大约需要5~10分钟. 先说结论 map类型 一图胜千言: 实例化示例: hashMap := gmap.New(true) listMap := gmap.NewListMap(true) treeMap := g

  • GoFrame框架garray对比PHP的array优势

    目录 打印结果 打印结果 打印结果 打印结果: 打印结果 打印结果 打印结果 写过PHP的同学都知道 PHP的数组Array非常好用,特别灵活. 我在写PHP之前使用Java做安卓开发,在接触PHP的数组Array之后,直呼太香了! 而在学习Go基础知识的时候了解到Go的数组和PHP的数组并不一样:从一定程度上讲,Go的slice切片类型和PHP的数组array比较像(不固定长度.引用类型.动态扩容等),但是在开发使用中远远不像PHP的array灵活. 初识GoFrame 最近在使用基于Go语言

  • GoFrame框架ORM原生方法对象操作开箱体验

    目录 前言 开箱体验 1. ORM对象 tips 2. 数据写入 3. 数据查询(单条) 4. 数据查询(列表) 5. 数据保存 6. 批量操作 tips 7. 数据更新/删除 tips 总结 前言 最近一直在用GoFrame(下文简称gf)来开发项目,在熟悉业务逻辑之后就是马不停蹄的撸代码了. 之前整理过结构体和json转换的文章:GoFrame必知必会之Scan:类型转换,今天整理同样比较重要的ORM相关的文章. gf是支持ORM原生操作的,在ORM链式操作执行不了太过于复杂的SQL操作时,

  • GoFrame框架使用避坑指南和实践干货

    目录 gf gen dao 设置参数可不传 model作为结构体类型 使用with关联取值而不是join 不使用结构体批量添加数据 主程序如下: gomeGoods.MainImgs的定义: 插入数据 gf gen dao 生成dao层的脚手架工具很好用,我遇到的坑是这样的: 生成的dao文件和同事们的不一致,生成文件成功,但是对应的Columns是空的,虽然有这个方法,但是方法内没有值.我的版本比同事们的略高,我一直以为是这个原因,各种降级和同事保持一致的版本后还是不行. 最终发现:是配置文件

  • GoFrame ORM原生方法操作示例

    目录 前言 常用方法 SQL操作方法,返回原生的标准库sql对象 数据表记录查询: 数据单条操作 数据修改/删除 总结 前言 最近一直在用GoFrame(下文简称gf)来开发项目,在熟悉业务逻辑之后就是马不停蹄的撸代码了. 之前整理过结构体和json转换的文章:GoFrame必知必会之Scan:类型转换,今天整理同样比较重要的ORM相关的文章. gf是支持ORM原生操作的,在ORM链式操作执行不了太过于复杂的SQL操作时,可以交给方法操作来处理. 这篇文章整理原生操作的常用方法,下篇文章根据整理

  • GoFrame框架gset使用对比PHP Java Redis优势

    目录 特点 使用入门 对比PHP和Java PHP JAVA GO原生 GoFrame 延伸 这篇文章将会为大家介绍GoFrame gset使用入门,为了让大家更好的理解,会简明扼要的分析一下集合类型Set的特点,对比一下Java.PHP.原生Go对集合Set类型的支持情况,如果不支持Set类型,我们如何找到解决方案,来实现元素不可重复性和交差并补集的需求. 特点 集合gset:一组不可重复的元素,元素可以是任何类型 上一篇文章介绍的: GoFrame的garray为什么比PHP的array还好

  • GoFrame框架gset交差并补集使用实例

    目录 使用场景方法介绍 Intersect: 交集 Diff: 差集 Union: 并集 Complement: 补集 举例 总结 上一篇文章:GoFrame gset使用入门 | 对比PHP.Java.Redis 得到了大家不错的反馈,今天继续为大哥分享gset的更多知识点. 使用场景方法介绍 交差并补集有非常多的应用场景,合理的使用交差并补集能减少我们的DB查询次数. Intersect: 交集 交集,属于set且属于others的元素为元素的集合. func (set *Set) Inte

  • goFrame的队列gqueue对比channel使用详解

    目录 channel gqueue 概念 使用场景: 代码演示 打印结果 优势 底层实现 阻止进程销毁 运行结果 总结 channel 首先明确一下channel的作用:用于go协程间的通信. go语言最大的特点就是支持高并发:goroutine和channel是支持高并发的重要组成部分. 单纯地将函数并发执行是没有意义的.函数与函数间需要交换数据才能体现并发执行函数的意义. 如果说 goroutine 是Go程序并发的执行体,channel就是它们之间的连接.channel是可以让一个 gor

  • GoFrame框架gredis优雅的取值和类型转换

    目录 取值方法 不推荐 推荐 DoVar示例 ReceiveVar示例 HashSet示例 小技巧 总结 上一篇文章为大家介绍了 GoFrame gcache使用实践 | 缓存控制 淘汰策略 ,得到了大家积极的反馈. 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. 今天重点为大家介绍:GoFrame gredis 如何优雅的取值和类型转换 取值方法 不推荐 通过客户端方法Do/Receive获取的数据都是

  • GoFrame 框架缓存查询结果的示例详解

    目录 查询缓存 相关方法: 缓存对象 缓存适配(Redis缓存) 使用示例 数据表结构 示例代码 小技巧 运行结果分析 总结 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. 今天重点为大家介绍:GoFrame 如何优雅的缓存查询结果 查询缓存 gdb支持对查询结果的缓存处理,常用于多读少写的查询缓存场景,并支持手动的缓存清理. 需要注意的是,查询缓存仅支持链式操作,且在事务操作下不可用. 相关方法: fu

  • Java redis使用场景介绍

    目录 1.作为缓存 1.1 为何使用 1.2 什么样的数据适合放入缓存 1.3 使用redis作为缓存 1.3.1 未使用配置类 1.3.2 使用配置类 2.分布式锁 2.1 压测工具的使用 2.2 库存项目 2.2.1 controller层 2.2.2 dao层 2.2.3 entity层 2.2.4 service层 2.2.5 mapper 2.2.6 依赖 2.2.7 测试结果 2.3 解决方案 2.3.1 使用 synchronized 或者lock锁 2.3.2 使用redisTe

  • laravel框架与其他框架的详细对比

    优点: 1.代码比较明白易懂,跟英语句子差不多,关键词就是函数,举个例子,获取数据库中某个表的所有数据: $article=new Article; $articles=$article->all(); //这样就得到了articles表所有记录的所有字段: $count = $article->where('class_id','=', 1)->count(); //是不是一看就明白了意思?查找分类id为1的记录,并计算出个数. 这样的例子太多,举例就举这两个. 2.文档非常丰富,社区

  • java redis 实现简单的用户签到功能

    业务需求是用户每天只能签到一次,而且签到后用户增加积分,所以把用户每次签到时放到redis 缓存里面,然后每天凌晨时再清除缓存,大概简单思想是这样的 直接看代码吧如下 @Transactional @Override public void signIn(Integer memberId) throws BizException { if(memberId==null){ throw new BizException(ErrorCode.BIZ_EXCEPTION.getErrcode(), "

  • 详解Java redis中缓存穿透 缓存击穿 雪崩三种现象以及解决方法

    目录 前言 一.缓存穿透 二.缓存击穿 三.雪崩现象 总结 前言 本文主要阐述redis中的三种现象 1.缓存穿透 2.缓存击穿 3.雪崩现象 本文主要说明本人对三种情况的理解,如果需要知道redis基础请查看其他博客,加油! 一.缓存穿透 理解:何为缓存穿透,先要了解穿透,这样有助于区分穿透和击穿,穿透就类似于伤害一点一点的累计,最终打到穿透的目的,类似于射手,一下一下普通攻击,最终杀死对方,先上图 先来描述一下缓存穿透的过程: 1.由于我们取数据的原则是先查询redis上,如果redis上有

随机推荐