Golang 使用Map实现去重与set的功能操作


Posted in Golang onApril 29, 2021

假设现在有一个需求

将以下 url 保存起来,要求不重复

www.baidu.com
www.sina.com.cn
www.hao123.com
www.baidu.com
www.hao123.com

可以利用 map 的 key 唯一性的问题处理

package main 
var set = map[string]bool { 
}
 
func main() {
    ...
    url := xxx
    if set[url] {
        // 表示集合中已经存在
        return
    }
 
    set[url] = true           // 否则如果不存在,设置为true
}

// 完成后,set的所有的key值为不重复的值

在此之前,需要确定 golang 支持的 map 的 key 数量

可以手写暴力写入测试

package main 
import (
 "fmt"
)
 
var test = map[int]int { 
}
 
func main() {
 for i := 0; i < 10000000; i++ {        // 测试对1000万key的支持,完美支持
  fmt.Println(i)
  test[i] = i
 }
}

补充:golang map/set类型

map类型

1. 基础特性

map是一种无序的键值对的集合; 所以可以类似数组/slice一样进行迭代

map的值可以使内建类型, 也可以是struct类型

内部使用hash表实现, map的hash表包含了一个collection of buckets(桶集合)

2. 声明与初始化

package main
import (
    "fmt"
)
// map[keyType]valueType
func initMap() {
    // 通过make方法创建
    dict := make(map[string]int)
    dict["age"] = 18
    // 直接创建
    dict2 := map[string]string{"name":"xiaoming", "phone":"135xxx"}
    dict2["addr"] = "Guangzhou"
    fmt.Printf("%v\n", dict2)
}
func main() {
    initMap()
}

3. 元素访问

package main
import (
    "fmt"
)
type Student struct {
    name string
    grade int
}
func useMap() {
    //使用前应该先初始化, 否则panic报错
    // var map1 map[string]string
    // map1["a"] = "b" // will panic
    map1 := make(map[string]Student)
    map1["s1"] = Student{name:"xiaomo", grade:1}
    fmt.Printf("%v\n", map1)
}
func main() {
    useMap()
}

4. 在函数中传递map

在函数间传递map对象, 是传递引用而不是拷贝; 因此在函数中对map进行了修改, 引用到它的地方也会相应修改

package main
import (
    "fmt"
)
type Student struct {
    name string
    grade int
}
func useMap() {
    map1 := make(map[string]Student)
    map1["s1"] = Student{name:"xiaomo", grade:1}
    // 作为函数参数传递
    printMap(map1)
}
func printMap(m map[string]Student) {
    fmt.Printf("currentMap: %v\n", m)
}
func main() {
    useMap()
}

Set类型

golang没有内置Set类型, 可以自定义实现。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
go语言求任意类型切片的长度操作
Apr 26 Golang
golang中的空slice案例
Apr 27 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
golang中的并发和并行
May 08 Golang
Golang的继承模拟实例
Jun 30 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
深入理解 Golang 的字符串
May 04 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 #Golang
Go使用协程交替打印字符
Apr 29 #Golang
golang goroutine顺序输出方式
Apr 29 #Golang
golang 在windows中设置环境变量的操作
解决golang在import自己的包报错的问题
golang import自定义包方式
golang 接口嵌套实现复用的操作
Apr 29 #Golang
You might like
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
繁简字转换功能
2006/07/19 Javascript
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
python 实现二维列表转置
2019/12/02 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
python em算法的实现
2020/10/03 Python
Python进行特征提取的示例代码
2020/10/15 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
怎样声明接口
2014/09/19 面试题
外语学院毕业生的自我鉴定
2013/11/28 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
老干部座谈会主持词
2015/07/03 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL