Golang实现set

Golang语言本身未实现set,但是实现了map

golang的map是一种无序的键值对的集合,其中键是唯一的

而set是键的不重复的集合,因此可以用map来实现set

由于map是key-value集合,如果使用map来实现set,则不需要关注value的具体类型和值

struct{}是具有零个元素的struct,struct{}的大小为0,不占用空间,因此十分适合作为value使用

Golang是静态强类型语言,对于int8、uint8、int64、uint64、 string基础数据类型的set,均需要实现类似的代码

以int64为例,实现set的基本操作

采用上面的方法实现,会充斥着大量重复代码,对于其它类型如int8,uint8,string等类型,需要单独实现,尽管逻辑基本一致。

在Go 1.18版本之前,我们可以使用反射来避免这个问题,

使用反射在运行时推断具体的类型,虽然有性能上的损耗,但是单次纳秒级别的操作,基本可以忽略不计。

interface{}是没有方法的空接口,所有类型都实现了空接口

通过反射可以从interface获取对象的值和类型

反射在编译时缺少类型检查,比如对于同一个set,先后插入int类型和string类型数据,在编译和运行阶段均不会报错。

使用反射在一定程度上避免了大量的重复代码,但是将set转换为slice还是会存在重复的相似逻辑的代码

并且需要在运行时获取/判断对象的类型和值,存在一定的性能损耗

在Go 1.18版本提供了范型(Generics)的支持,

范型可以在编译期间进行类型检查和类型推断,相对于反射机制而言,性能有所提升

可以看出来,Int64HashSet性能最优,GenericHashSet次之,HashSet性能最差。

从实际使用角度看

对于Go < 1.18版本,使用HashSet即可。如果追求性能的极致,不介意大量重复代码,那还是使用Int64HashSet

对于单次操作的时间在ns级别,对于大部分业务场景,反射带来的性能损耗基本可以忽略,性能的瓶颈并不在这里。

对于Go >= 1.18版本,可以使用GenericHashSet

如果需要实现有序set,则需要链表辅助实现

如果你觉得还可以,点一下Star🌟

Original: https://www.cnblogs.com/amos01/p/16586250.html
Author: Amos01
Title: Golang实现set

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611440/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaWeb详解

    一、基本概念 1.前言 web开发: web,网页的意思 静态web html,css 提供给所有人看的数据始终不会发生变化 动态web 提供给所有人看的数据始终会发生变化,每个人…

    数据库 2023年6月16日
    082
  • NO.6 HTML+CSS 笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月14日
    067
  • 2022春秋杯春季赛勇者山峰-misc

    这几天搞完取证就开始弄这些个东西,属实把我整麻了,临场我就整不出来,可能是功利心太重了 ,一着急就啥也不会,毕竟这misc只是用来辅助锻炼我的取证的。。 tiger 1.These…

    数据库 2023年6月11日
    086
  • pg 锁表

    select * from pg_catalog.pg_stat_activity where usename =’gis_bd_app’ and wait…

    数据库 2023年6月6日
    094
  • MySQL索引分类及相关概念辨析

    本文链接:https://www.cnblogs.com/ibigboy/p/16198243.html 之前的一篇《MySQL索引底层数据结构及原理深入分析》很受读者欢迎,成功地…

    数据库 2023年6月11日
    084
  • 【干货总结】:可能是史上最全的MySQL和PGSQL对比材料

    版权情况:PostgreSQL 11(免费开源)、MySQL5.7 Oracle官方社区版(免费开源)1. CPU限制 PGSQL 没有CPU核心数限制,有多少CPU核就用多少 M…

    数据库 2023年6月9日
    058
  • keycloak~资源的远程授权

    17.1远程资源授权准备 17.1.1认证和访问流程图 参考:http://www.zyiz.net/tech/detail-141309.html 17.1.2为用户指定角色 可…

    数据库 2023年6月6日
    081
  • 当你想静下来的时候,你就可以静下来。

    当你想静下来的时候,你就可以静下来。1,2年前,我有时还在为当时选的专业恼悔,因为继续教育是同事推荐的,最后同事给我的消息是,他在疫情后去其他公司,做人工智能的公司,拿月薪20K,…

    数据库 2023年6月11日
    075
  • Python第二十一天 fileinput模块

    Python第二十一天 fileinput模块 fileinput模块 fileinput.input([files[, inplace[, backup[, bufsize[, …

    数据库 2023年6月9日
    062
  • Mysql数据库服务端的安装

    一般提到Mysql数据库的安装在工作当中是说的安装数据库管理软件的服务端,服务端的安装可以安装在Windows环境,也可以安装在Linux环境。 Windows环境安装:目前安装比…

    数据库 2023年6月6日
    084
  • 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1、 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库。如果自己开发然后搭建,耗费时间又比较多,于是…

    数据库 2023年6月16日
    097
  • JavaWeb 07_创建web项目连接MySQL实现注册登录功能

    一、创建一个web项目,参照JW/01_创建web项目及部署 二、在NAVICat 里建数据库 db_01,建表tb_user ,字段UName 、Pwd 三、在web下创建一个D…

    数据库 2023年5月24日
    066
  • Centos7 离线安装K3s

    1、安装前准备 github地址:https://github.com/k3s-io/k3s/releases k3s二进制文件:k3s下载地址:github地址 / 百度网盘地址…

    数据库 2023年6月14日
    099
  • 栈和队列数据结构

    栈和队列都是常用的数据结构。栈的应用非常的广泛,其原理也是非常经典的。 一、栈 ①栈(stack)又名堆栈,他是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这…

    数据库 2023年6月11日
    0114
  • MySQL数据库CRUD

    INSERT语句 INSERT INTO 表名 (column1,column2,column3,…)VALUES (value1,value2,value3,&#82…

    数据库 2023年6月16日
    072
  • 学会Linux,看完这篇就行了!

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/797ab07d.html 你好,我是测试蔡坨坨。 对于测试同学来说,Linux基本属于必学必会内容,招…

    数据库 2023年6月11日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球