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
goland 恢复已更改文件的操作
Apr 28 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
golang 语言中错误处理机制
Aug 30 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang bufio详细讲解
Apr 21 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 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 array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
解析strtr函数的效率问题
2013/06/26 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
Python获取系统默认字符编码的方法
2015/06/04 Python
Python Requests 基础入门
2016/04/07 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
利用python画出AUC曲线的实例
2020/02/28 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
关于box-sizing的全面理解
2016/07/28 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
学校火灾防控方案
2014/06/09 职场文书
领导干部保密承诺书
2014/08/30 职场文书
2014年居委会工作总结
2014/12/09 职场文书
七一晚会主持词
2015/06/29 职场文书
大学运动会通讯稿
2015/07/18 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
nginx 配置指令之location使用详解
2022/05/25 Servers