最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言中數(shù)據(jù)接口set集合的實(shí)現(xiàn)

 更新時(shí)間:2024年10月21日 11:24:46   作者:SRExianxian  
set集合是一種常見的數(shù)據(jù)結(jié)構(gòu),它代表了一個(gè)唯一元素的集合,本文主要介紹了set的基本特性,包括唯一性、無序性、可變性和集合運(yùn)算,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

set 是一種常用的數(shù)據(jù)結(jié)構(gòu),它表示一組唯一元素的集合。在不同的編程語言和庫中,set 可能有不同的實(shí)現(xiàn)方式和特性。

set 集合數(shù)據(jù)結(jié)構(gòu)具有以下特性:

  • 唯一性:set 中的元素是唯一的,不允許重復(fù)。這意味著在 set 中添加重復(fù)的元素不會產(chǎn)生任何變化。
  • 無序性:set 中的元素沒有順序。不能通過索引訪問 set 中的元素,也不能對 set 中的元素進(jìn)行排序。
  • 可變性:set 通常是可變的,這意味著你可以添加或刪除元素。
  • 集合運(yùn)算:set 支持多種集合運(yùn)算,如并集、交集和差集。

在這里插入圖片描述

Go語言中最常用的兩種數(shù)據(jù)結(jié)構(gòu)分別是 slice 和 map。 除了 Go 內(nèi)置的數(shù)據(jù)結(jié)構(gòu),還有一些數(shù)據(jù)結(jié)構(gòu)是由 Go 的官方 container 包提供,如 heap 堆、list 雙向鏈表和ring 回環(huán)鏈表。但Go語言中并沒有內(nèi)置set這種數(shù)據(jù)結(jié)構(gòu)。本文聊聊go語言中set的實(shí)現(xiàn)方式。

我們知道 map 的鍵是具有唯一性,所以可以用 map 來實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu) set。

set的實(shí)現(xiàn)

使用map使用一個(gè)set集合,意味著我們只關(guān)心 key 的存在,其 value 值并不重要,直接將vlaue設(shè)置為空接口。

package main

import (
	"errors"
	"fmt"
	"sync"
)

/*
用map實(shí)現(xiàn)一個(gè)線程安全的set
*/

type void struct{}

var member void

type IData interface{}

type Set struct {
	mapset map[IData]struct{}
	mutex  sync.Mutex
}

func NewSet() *Set {
	return &Set{
		mapset: make(map[IData]struct{}),
		mutex:  sync.Mutex{},
	}
}

func (s *Set) Add(data IData) bool {
	s.mutex.Lock()
	defer s.mutex.Unlock()
	s.mapset[data] = member
	return true
}

func (s *Set) Remove(data IData) error {
	s.mutex.Lock()
	defer s.mutex.Unlock()
	for k, _ := range s.mapset {
		if k == data {
			delete(s.mapset, k)
			return nil
		}
	}
	return errors.New("not found")
}

func (s *Set) Pop() IData {
	s.mutex.Lock()
	defer s.mutex.Unlock()
	if len(s.mapset) <= 0 {
		return nil
	}
	for k, _ := range s.mapset {
		return s.mapset[k]
	}
	return nil
}

func (s *Set) Size() int {
	s.mutex.Lock()
	defer s.mutex.Unlock()
	return len(s.mapset)

}

func (s *Set) All() []IData {
	s.mutex.Lock()
	defer s.mutex.Unlock()
	datas := make([]IData, 0)
	for k, _ := range s.mapset {
		datas = append(datas, k)
	}
	return datas
}

func main() {
	// test
	myset := NewSet()
	myset.Add(1)
	myset.Add(2)
	myset.Add(1)
	fmt.Println(myset.All()) // [1 2]

	myset.Add(3)
	fmt.Println(myset.Size()) //3
	fmt.Println(myset.All())  // [1 2 3]

	myset.Remove(2)
	fmt.Println(myset.All()) // [1 2 3]

}

set的三方庫

在kubernetes中也實(shí)現(xiàn)了stirng,int32,int43,byte等幾種基本類型為值的set集合。接下來我們分析下源碼實(shí)現(xiàn)。找到源碼為位置k8s.io/apimachinery/pkg/util/sets

// sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
// String類型定義,使用map來實(shí)現(xiàn)set集合,集合的元素是string
type String map[string]Empty

// NewString creates a String from a list of values.
// 構(gòu)造一個(gè)set,set集合存放的值是string類型
func NewString(items ...string) String {
	ss := String{}
	ss.Insert(items...)
	return ss
}


// Insert adds items to the set.
// 插入元素到集合
func (s String) Insert(items ...string) String {
	for _, item := range items {
		s[item] = Empty{}
	}
	return s
}

// Delete removes all items from the set.
// 從set中刪除指定string
func (s String) Delete(items ...string) String {
	for _, item := range items {
		delete(s, item)
	}
	return s
}

// Has returns true if and only if item is contained in the set.
// 判斷set是否包含指定的string
func (s String) Has(item string) bool {
	_, contained := s[item]
	return contained
}

// HasAll returns true if and only if all items are contained in the set.
// 判斷set是否包括一組所有的字符串
func (s String) HasAll(items ...string) bool {
	for _, item := range items {
		if !s.Has(item) {
			return false
		}
	}
	return true
}

// HasAny returns true if any items are contained in the set.
// 判斷一組字符串是否有包括在set中
func (s String) HasAny(items ...string) bool {
	for _, item := range items {
		if s.Has(item) {
			return true
		}
	}
	return false
}

總結(jié)

本文介紹了set的特點(diǎn),并介紹go語言中如何用map實(shí)現(xiàn)一個(gè)set,最后我們分析了kubernete源碼中的set庫的源碼。由于源碼比較簡單,就沒有展開分析。

到此這篇關(guān)于go語言中數(shù)據(jù)接口set集合的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語言 set集合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度

    利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度

    這篇文章主要介紹了利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Golang獲取本地IP地址方法分享

    Golang獲取本地IP地址方法分享

    這篇文章主要給大家介紹了Golang 獲取本地 IP 地址方法,文中有詳細(xì)的代碼示例,對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • GO語言Context的作用及各種使用方法

    GO語言Context的作用及各種使用方法

    golang的Context包是專門用來處理多個(gè)goroutine之間與請求域的數(shù)據(jù)、取消信號、截止時(shí)間等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于GO語言Context的作用及各種使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Go表達(dá)式引擎expr基礎(chǔ)用法實(shí)戰(zhàn)指南

    Go表達(dá)式引擎expr基礎(chǔ)用法實(shí)戰(zhàn)指南

    expr是一個(gè)高性能的 Go 表達(dá)式引擎,它允許你在代碼中安全地執(zhí)行動態(tài)生成的表達(dá)式,本文給大家介紹Go表達(dá)式引擎expr基礎(chǔ)用法實(shí)戰(zhàn)指南,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Go語言中的流程控制結(jié)構(gòu)和函數(shù)詳解

    Go語言中的流程控制結(jié)構(gòu)和函數(shù)詳解

    這篇文章主要介紹了Go語言中的流程控制結(jié)構(gòu)和函數(shù)詳解,本文詳細(xì)講解了if、goto、for、switch等控制語句,同時(shí)對函數(shù)相關(guān)知識做了講解,需要的朋友可以參考下
    2014-10-10
  • 三種Golang數(shù)組拷貝方式及性能分析詳解

    三種Golang數(shù)組拷貝方式及性能分析詳解

    在Go語言中,我們可以使用for、append()和copy()進(jìn)行數(shù)組拷貝。這篇文章主要為大家詳細(xì)介紹一下這三種方式的具體實(shí)現(xiàn)與性能分析,需要的可以參考一下
    2022-08-08
  • Go語言對字符串進(jìn)行SHA1哈希運(yùn)算的方法

    Go語言對字符串進(jìn)行SHA1哈希運(yùn)算的方法

    這篇文章主要介紹了Go語言對字符串進(jìn)行SHA1哈希運(yùn)算的方法,實(shí)例分析了Go語言針對字符串操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Go語言轉(zhuǎn)化php數(shù)組的示例代碼

    Go語言轉(zhuǎn)化php數(shù)組的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Go語言如何實(shí)現(xiàn)轉(zhuǎn)化php數(shù)組的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入學(xué)習(xí)GO語言有一定的幫助,需要的可以參考下
    2023-11-11
  • 重學(xué)Go語言之?dāng)?shù)組的具體使用詳解

    重學(xué)Go語言之?dāng)?shù)組的具體使用詳解

    Go的數(shù)組是一種復(fù)合數(shù)據(jù)類型,在平時(shí)開發(fā)中并不常用,更常用的是切片(slice),可以把切片看作是能動態(tài)擴(kuò)容的數(shù)組,切片的底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,所以數(shù)組雖不常用,但仍然有必要掌握
    2023-02-02
  • 使用Go語言發(fā)送郵件的示例代碼

    使用Go語言發(fā)送郵件的示例代碼

    很多朋友想試試用Go語言發(fā)送郵件,所以接下來小編給大家介紹一下如何用Go語言發(fā)送郵件,文中通過代碼實(shí)例講解的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評論

周至县| 贵定县| 洪洞县| 常州市| 离岛区| 西昌市| 莱西市| 乌兰县| 隆安县| 通榆县| 泰安市| 平罗县| 石嘴山市| 苏尼特左旗| 大悟县| 张北县| 吉林省| 江源县| 深州市| 台州市| 沅江市| 游戏| 玉门市| 报价| 通化市| 兴海县| 夏邑县| 淮阳县| 东海县| 东兰县| 宽甸| 洪洞县| 资阳市| 枣强县| 上杭县| 铜陵市| 大兴区| 永泰县| 通化县| 博爱县| 左权县|