網站首頁 編程語言 正文
如何實現set
Go中是不提供Set類型的,Set是一個集合,其本質就是一個List,只是List里的元素不能重復。
Go提供了map類型,但是我們知道,map類型的key是不能重復的,因此,我們可以利用這一點,來實現一個set。那value呢?value我們可以用一個常量來代替,比如一個空結構體,實際上空結構體不占任何內存,使用空結構體,能夠幫我們節省內存空間,提高性能
下面看看兩種結構體的聲明方法
type Empty struct { } func main(){ ? ? empty := new(Empty) ? ? fmt.Println(unsafe.Sizeof(empty)) //8 }
這種形式的聲明會返回一個指向該結構體的指針
而下面這種結構體的聲明就是一個隨處可用的空緩存
var empty Empty fmt.Println(unsafe.Sizeof(empty)) //0
構造一個Set
構造一個set,首先定義set的類型
//set類型 type Set struct { m map[int]Empty }
為一個結構體類型,內部一個成員為一個map,這也是主要我們存儲值的容器
產生set的工廠
//返回一個set func SetFactory() *Set{ return &Set{ m:map[int]Empty{}, } }
這里初始化一個set,內部的map置空
現在給該set類型添加幾個方法,分別為
- Add 添加元素
- Remove 刪除元素
- Len 獲取set長度
- Clear 清空set
- Traverse 遍歷set
- SortTraverse 有順序的遍歷Set
由于map自身的特性,在golang中它是由一個hash表做支持的,每個hash函數都會導致不同的遍歷順序,因此,golang要求程序不依賴于具體的hash函數實現,因此,每次遍歷map都會有不一樣的順序,然而,對于set來說,可能會要求提供一種有順序的遍歷。因此,這里提供一個有順序的遍歷方法
下面是具體的實現
//添加元素 func (s *Set) Add(val int) { ? ? s.m[val] = empty } //刪除元素 func (s *Set) Remove(val int) { ? ? delete(s.m, val) } //獲取長度 func (s *Set) Len() int { ? ? return len(s.m) } //清空set func (s *Set) Clear() { ? ? s.m = make(map[int]Empty) } //遍歷set func (s *Set) Traverse(){ ? ? for v := range s.m { ? ? ? ? fmt.Println(v) ? ? } } //排序輸出? func (s *Set) SortTraverse(){ ? ? vals := make([]int, 0, s.Len()) ? ? for v := range s.m { ? ? ? ? vals = append(vals, v) ? ? } ? ? //排序 ? ? sort.Ints(vals) ? ? for _, v := range vals { ? ? ? ? fmt.Println(v) ? ? } }
大家可以挨著挨著的打印測試,我這里就不再贅述了
原文鏈接:https://blog.csdn.net/HaoDaWang/article/details/80006059
相關推薦
- 2022-03-23 C++控制權限關鍵字protected_C 語言
- 2024-07-13 spring-cloud和spring-cloud-alibaba的關系
- 2022-05-31 Python學習之yaml文件的讀取詳解_python
- 2022-04-04 webpack-插件: plugin的使用(clean-webpack-plugin)
- 2023-04-11 Python中字符串類型代碼的執行函數——eval()、exec()和compile()詳解_pyt
- 2022-07-25 Python?APScheduler?定時任務詳解_python
- 2023-10-24 解決Ubuntu下載速度或更新速度緩慢問題
- 2023-09-12 如何升級spring boot中spring框架的版本
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支