GO实现Set并且可以存储string和int

本文介绍如何用Go语言实现一个Set数据结构,该结构能够确保数据的唯一性和有序性。利用Go内置的map进行存储,并通过自定义方法实现元素的添加、删除、查找等功能。此外,还介绍了如何遍历Set并按数据类型分别排序输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 因为Go没有Java的生态,正好自己又学过Java,想实现一个Set来。

Set的存入无序,输出是有序的,并且存储数据不重复,因此 我们可以使用map来存在:

本文章涉及到的知识点:

1.struct{}  空结构体 可以不占用内存

2.go 有自己的排序函数啦,在sort里面

3.自己实现排序也可以  只要实现了Len()  Less() 以及Swap()方法就可以了

4.intterface{} 空接口可以用来存储任何数据类型   判断具体类型的时候 我们使用go 的特性 断言

代码实现

package main

import (
	"fmt"
	"sort"
)

type Empty struct{}

var empty Empty

type Set struct {
	m map[interface{}]Empty
}

func SetFactory() *Set {
	return &Set{
		m: map[interface{}]Empty{},
	}
}

// 添加元素
func (s *Set) Add(val interface{}) {
	s.m[val] = empty // 使用一个empty 到单利作为所有键的值
}

// 删除元素
func (s *Set) Del(val interface{}) {
	delete(s.m, val)
}

//清空set
func (s *Set) Clear() {
	s.m = make(map[interface{}]Empty, 0)
}

// 查看一个元素是否存在
func (s *Set) Exist(val interface{}) bool {
	_, ok := s.m[val]
	return ok
}

//// 遍历Set
func (s *Set) Traverse() {
	intVals := make([]int, 0)
	strVals := make([]string, 0)
	var t interface{}
	fmt.Println(s)
	for v := range s.m {
		t = v
		switch t.(type) {
		case string: //  t.(string)    go intface 转成 其他数据类型  使用t.(string) 即可  t 要是intface类型
			strVals = append(strVals, t.(string))
		case int:
			intVals = append(intVals, t.(int))
		}
	}
	sort.Ints(intVals)
	sort.Strings(strVals)

	for _,v := range intVals {
		fmt.Println(v)
	}
	for _,v := range strVals {
		fmt.Println(v)
	}


}


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

使用:

package main

import "fmt"

func main() {
	// 因为我们要更改里面的数据 所有需要用指针去修改数据, 也就是我们
	s := SetFactory()
	//s.Traverse()
	for i := 0; i < 100; i++ {
		s.Add("hello Go Set")
		s.Add("hello Go Set111")
		s.Add("hello Go Set2222")
		s.Add("hello Go Set3333")
		s.Add("hello Go Set4444")
		s.Add(i)
	}

	s.Del("hello Go Set4444")
	s.Del("hello Go Set")
	k := s.Exist(3)
	fmt.Println(k)

	s.Traverse()

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值