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 post文件时Content-Type出现的问题
May 02 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
golang语言指针操作
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang jwt身份认证
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
Golang实现可重入锁的示例代码
May 25 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
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
php操作redis缓存方法分享
2015/06/03 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python heapq使用详解及实例代码
2017/01/25 Python
Python 处理文件的几种方式
2019/08/23 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
Ruby如何定义一个类
2012/10/08 面试题
《莫泊桑拜师》教学反思
2014/04/23 职场文书
通信工程求职信
2014/07/16 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
员工福利申请报告
2015/05/15 职场文书
大学生受助感言
2015/08/01 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android