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 生成对应的数据表struct定义操作
Apr 28 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
GO中sync包自由控制并发示例详解
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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
php Smarty模板生成html文档的方法
2010/04/12 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
理解JavaScript原型链
2016/10/25 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
Python判断变量是否已经定义的方法
2014/08/18 Python
python保存网页图片到本地的方法
2018/07/24 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
大学毕业后的十年规划
2014/01/07 职场文书
《我的信念》教学反思
2014/02/15 职场文书
考博专家推荐信
2014/05/10 职场文书
植物生产学专业求职信
2014/08/08 职场文书
学习教师法的心得体会
2014/09/03 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
公司财务部岗位职责
2015/04/14 职场文书
八月一日观后感
2015/06/10 职场文书
跳高加油稿
2015/07/21 职场文书
员工考勤管理制度
2015/08/06 职场文书