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 02 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang json数组拼接的实例
Apr 28 Golang
golang 实现Location跳转方式
May 02 Golang
go 实现简易端口扫描的示例
May 22 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go语言基础知识点介绍
Jul 04 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Golang流模式之grpc的四种数据流
Apr 13 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
一棵php的类树(支持无限分类)
2006/10/09 PHP
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP 中的批处理的实现
2007/06/14 PHP
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
js 操作select相关方法函数
2009/12/06 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
javascript几个易错点记录
2014/11/26 Javascript
javascript实现连续赋值
2015/08/10 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
Vue性能优化的方法
2020/07/30 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
如何客观的进行自我评价
2013/12/17 职场文书
营销总经理岗位职责
2014/02/02 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
离婚协议书怎么写
2014/09/12 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
大学生党性分析材料
2014/12/19 职场文书
英语读书笔记
2015/07/02 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Python中with上下文管理协议的作用及用法
2022/03/18 Python