婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang中Set類型的實現方法示例詳解

Golang中Set類型的實現方法示例詳解

熱門標簽:鄭州亮點科技用的什么外呼系統 釘釘有地圖標注功能嗎 惠州電銷防封電話卡 建造者2地圖標注 浙江高頻外呼系統多少錢一個月 阿里云ai電話機器人 濱州自動電銷機器人排名 汕頭小型外呼系統 黃岡人工智能電銷機器人哪個好

前言

本篇主要給大家講述了如何利用Go語言的語法特性實現Set類型的數據結構,分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹吧。

需求

對于Set類型的數據結構,其實本質上跟List沒什么多大的區別。無非是Set不能含有重復的Item的特性,Set有初始化、Add、Clear、Remove、Contains等操作。接下來看具體的實現方式分析吧。

實現

仍然按照已有的編程經驗來聯想如何實現基本Set功能,在Java中很容易知道HashSet的底層實現是HashMap,核心的就是用一個常量來填充Map鍵值對中的Value選項。除此之外,重點關注Go中Map的數據結構,Key是不允許重復的,如下所示:

m := map[string]string{
 "1": "one",
 "2": "two",
 "1": "one",
 "3": "three",
 }
 fmt.Println(m)

程序會直接報錯,提示重復Key值,這樣就非常符合Set的特性需求了。

定義

前面分析出Set的Value為固定的值,用一個常量替代即可。但是筆者分析的實現源碼,用的是一個空結構體來實現的,如下所示:

// 空結構體
var Exists = struct{}{}
// Set is the main interface
type Set struct {
 // struct為結構體類型的變量
 m map[interface{}]struct{}
}

為了解決上面為什么用空結構體來做常量Value,先看下面的是測試:

import (
 "fmt"
 "unsafe"
)

// 定義非空結構體
type S struct {
  a uint16
  b uint32
}

func main() {
 var s S
 fmt.Println(unsafe.Sizeof(s)) // prints 8, not 6
 var s2 struct{}
 fmt.Println(unsafe.Sizeof(s2)) // prints 0
}

打印出空結構體變量的內存占用大小為0,再看看下面這個測試:

a := struct{}{}
b := struct{}{}
fmt.Println(a == b) // true
fmt.Printf("%p, %p\n", a, b) // 0x55a988, 0x55a988

很有趣,a和b竟然相等,并且a和b的地址也是一樣的。現在各位應該明白了為什么會有:

var Exists = struct{}{}

這樣的常量也來填充所有Map的Value了吧,Go真是精彩!!!

初始化

Set類型數據結構的初始化操作,在聲明的同時可以選擇傳入或者不傳入進去。聲明Map切片的時候,Key可以為任意類型的數據,用空接口來實現即可。Value的話按照上面的分析,用空結構體即可:

func New(items ...interface{}) *Set {
 // 獲取Set的地址
 s := Set{}
 // 聲明map類型的數據結構
 s.m = make(map[interface{}]struct{})
 s.Add(items...)
 return s
}

添加

簡化操作可以添加不定個數的元素進入到Set中,用變長參數的特性來實現這個需求即可,因為Map不允許Key值相同,所以不必有排重操作。同時將Value數值指定為空結構體類型。

func (s *Set) Add(items ...interface{}) error {
 for _, item := range items {
 s.m[item] = Exists
 }
 return nil
}

包含

Contains操作其實就是查詢操作,看看有沒有對應的Item存在,可以利用Map的特性來實現,但是由于不需要Value的數值,所以可以用 _,ok來達到目的:

func (s *Set) Contains(item interface{}) bool {
 _, ok := s.m[item]
 return ok
}

長度和清除

獲取Set長度很簡單,只需要獲取底層實現的Map的長度即可:

func (s *Set) Size() int {
 return len(s.m)
}

清除操作的話,可以通過重新初始化Set來實現,如下即為實現過程:

func (s *Set) Clear() {
 s.m = make(map[interface{}]struct{})
}

相等

判斷兩個Set是否相等,可以通過循環遍歷來實現,即將A中的每一個元素,查詢在B中是否存在,只要有一個不存在,A和B就不相等,實現方式如下所示:

func (s *Set) Equal(other *Set) bool {
 // 如果兩者Size不相等,就不用比較了
 if s.Size() != other.Size() {
 return false
 }
 
 // 迭代查詢遍歷
 for key := range s.m {
  // 只要有一個不存在就返回false
 if !other.Contains(key) {
 return false
 }
 }
 return true
}

子集

判斷A是不是B的子集,也是循環遍歷的過程,具體分析在上面已經講述過,實現方式如下所示:

func (s *Set) IsSubset(other *Set) bool {
 // s的size長于other,不用說了
 if s.Size() > other.Size() {
 return false
 }
 // 迭代遍歷
 for key := range s.m {
 if !other.Contains(key) {
 return false
 }
 }
 return true
}

Ok,以上就是Go中Set的主要函數實現方式,還是很有意思的。繼續加油。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • golang 字符串切片去重實例
  • golang 解析word文檔操作
  • golang逐行讀取文件的操作
  • Golang中的path/filepath包用法
  • 以alpine作為基礎鏡像構建Golang可執行程序操作
  • golang將切片或數組根據某個字段進行分組操作
  • golang-redis之sorted set類型操作詳解

標簽:阿壩 泰安 東營 滄州 昭通 瀘州 駐馬店 晉中

巨人網絡通訊聲明:本文標題《Golang中Set類型的實現方法示例詳解》,本文關鍵詞  Golang,中,Set,類型,的,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang中Set類型的實現方法示例詳解》相關的同類信息!
  • 本頁收集關于Golang中Set類型的實現方法示例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产视频一区在线观看| 亚洲bdsm女犯bdsm网站| 精品系列免费在线观看| 国产精品美女久久久久av爽李琼| 在线观看av一区二区| 日韩精品午夜视频| 国产日产欧美精品一区二区三区| 色婷婷综合久久久中文一区二区| 激情文学综合丁香| 亚洲高清免费在线| 国产精品午夜在线观看| 日韩精品一区二区三区中文不卡| 色激情天天射综合网| 国产精品夜夜嗨| 老司机午夜精品| 美女视频黄a大片欧美| 亚洲第一av色| 亚洲综合一二区| 亚洲猫色日本管| 国产日韩成人精品| 精品成人一区二区| 日韩欧美一区二区视频| 欧美日韩亚洲高清一区二区| 色猫猫国产区一区二在线视频| 成人高清在线视频| 成人小视频在线观看| 成人永久免费视频| 狠狠色丁香九九婷婷综合五月| 日韩成人免费电影| 老司机精品视频在线| 美国毛片一区二区三区| 麻豆传媒一区二区三区| 久久er精品视频| 麻豆专区一区二区三区四区五区| 久久精品国产在热久久| 国产综合色在线视频区| 国产电影一区在线| 国产999精品久久久久久| 成人午夜看片网址| 91看片淫黄大片一级在线观看| 在线一区二区三区| 欧美日韩在线播放三区四区| 欧美一区二区三区人| 精品国产乱码久久久久久久 | 日韩av网站免费在线| 天堂av在线一区| 日韩1区2区3区| 国产成人精品网址| 色视频一区二区| 欧美精三区欧美精三区| 精品精品国产高清一毛片一天堂| 国产亚洲一区二区三区| 樱花影视一区二区| 久久激五月天综合精品| 99re这里都是精品| 欧美一区二区人人喊爽| 欧美高清在线视频| 午夜免费久久看| 国产真实精品久久二三区| 91成人在线观看喷潮| 欧美精品一区二区在线观看| 亚洲综合色噜噜狠狠| 久久www免费人成看片高清| 国产69精品久久99不卡| 色噜噜偷拍精品综合在线| 欧美一级午夜免费电影| 欧美国产欧美亚州国产日韩mv天天看完整 | 国产亚洲综合在线| 亚洲精品在线电影| 日韩一区欧美一区| 日本不卡一二三| 粉嫩aⅴ一区二区三区四区五区| 视频一区视频二区中文| 国产一区二区按摩在线观看| 99久久国产免费看| 欧美群妇大交群中文字幕| 在线成人高清不卡| 久久一二三国产| 天堂资源在线中文精品| 国产在线精品不卡| 欧美精品99久久久**| 久久亚洲精华国产精华液 | 国产69精品久久99不卡| 高清视频一区二区| 日韩精品综合一本久道在线视频| 亚洲午夜国产一区99re久久| 国产综合色产在线精品| 日韩丝袜情趣美女图片| 日韩美女久久久| 97久久精品人人澡人人爽| 日韩欧美在线网站| 石原莉奈在线亚洲二区| av中文字幕亚洲| 久久精品一区二区| 免费人成黄页网站在线一区二区| 欧美三级资源在线| 国产欧美精品一区二区色综合朱莉 | 午夜欧美在线一二页| 91精品91久久久中77777| 久久夜色精品国产欧美乱极品| 日本中文字幕一区| 94色蜜桃网一区二区三区| 日韩精品在线一区| 亚洲精品国产成人久久av盗摄| 精品一区精品二区高清| 欧美精品一区二区三区蜜桃| 亚洲mv在线观看| 日韩一级大片在线观看| 国产精品久久看| 99re免费视频精品全部| 欧美日韩黄色影视| 性做久久久久久| www.99精品| 综合激情成人伊人| 91麻豆产精品久久久久久| 亚洲欧洲精品天堂一级| 91电影在线观看| 亚洲一区影音先锋| 欧美一区二区啪啪| 亚洲美女一区二区三区| 精品视频999| 亚洲午夜国产一区99re久久| 日韩亚洲欧美成人一区| 日日欢夜夜爽一区| 久久亚洲一区二区三区四区| 激情六月婷婷综合| 亚洲黄色尤物视频| 欧美日韩另类一区| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩一区二区在线观看| 亚洲国产成人av好男人在线观看| 日韩一区二区在线观看| 美女网站一区二区| 国产欧美日韩精品a在线观看| 国产福利一区二区三区视频在线 | 国产精品免费观看视频| 热久久国产精品| 久久久久久久久岛国免费| 久久精品国产成人一区二区三区| 欧美精品一区男女天堂| 国产成人啪免费观看软件| 国产色产综合产在线视频| 久久一二三国产| 91.com在线观看| 日韩三级中文字幕| 欧美一区二区三区系列电影| 91精品综合久久久久久| 欧美日韩亚洲综合在线| av在线播放成人| 精品久久久久久久久久久久久久久 | 成人免费毛片aaaaa**| 懂色av一区二区夜夜嗨| 在线亚洲免费视频| 国产精品情趣视频| 亚洲在线视频网站| 国产二区国产一区在线观看| 日韩视频免费观看高清在线视频| 国产区在线观看成人精品| 亚洲美女区一区| 国产老女人精品毛片久久| 欧美精品少妇一区二区三区 | 亚洲天堂福利av| 亚洲电影你懂得| 国产剧情av麻豆香蕉精品| 91蝌蚪porny成人天涯| 欧美伊人久久久久久久久影院| 亚洲一区二区三区精品在线| 色哟哟国产精品| 成人91在线观看| 视频一区二区国产| 亚洲一区二区三区自拍| 精品久久久久久久一区二区蜜臀| 欧美美女直播网站| 丁香桃色午夜亚洲一区二区三区| 久久国产乱子精品免费女| 中文字幕不卡一区| 精品一区二区三区在线播放视频| 91国偷自产一区二区开放时间| 国产精品无遮挡| 久久麻豆一区二区| 三级影片在线观看欧美日韩一区二区 | 日韩欧美在线1卡| 亚洲高清不卡在线| 日本一区二区三区四区| 日本不卡123| 亚洲一区二区三区小说| 国产亚洲精品资源在线26u| 久久婷婷色综合| 日韩免费视频一区二区| 日韩欧美一二三四区| 色美美综合视频| 欧美日韩美少妇| 亚洲风情在线资源站| 亚洲一区二区av电影| 久久久久久麻豆| 欧美激情艳妇裸体舞| 3d动漫精品啪啪一区二区竹菊| 欧美一区二区视频在线观看2022| 欧美色图在线观看| 欧美日韩免费高清一区色橹橹|