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 相关文章推荐
golang 在windows中设置环境变量的操作
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
深入理解go slice结构
Sep 15 Golang
Go语言grpc和protobuf
Apr 13 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang日志包的使用
Apr 20 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang map映射的用法
Apr 22 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中使用Oracle数据库(1)
2006/10/09 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
2018/03/06 jQuery
vue的安装及element组件的安装方法
2018/03/09 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
Python标准库os.path包、glob包使用实例
2014/11/25 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
Python使用django搭建web开发环境
2017/06/09 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
使用python制作一个解压缩软件
2019/11/13 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
python梯度下降算法的实现
2020/02/24 Python
Python实现一个优先级队列的方法
2020/07/31 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
一套软件开发工程师笔试题
2015/05/18 面试题
中秋节超市促销方案
2014/01/30 职场文书
男女朋友协议书
2014/04/23 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2016春节慰问信范文
2015/03/25 职场文书
立案决定书范文
2015/06/24 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书