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:垃圾回收GC触发条件详解
Apr 24 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
golang json数组拼接的实例
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
go设置多个GOPATH的方式
May 05 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang之sync.Pool使用详解
May 06 Golang
Go timer如何调度
Jun 09 Golang
Golang的继承模拟实例
Jun 30 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang解析JSON对象
Apr 30 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
Python检测QQ在线状态的方法
2015/05/09 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
pandas的resample重采样的使用
2020/04/24 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
应届大学生的推荐信
2013/11/20 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
上班离岗检讨书
2014/01/27 职场文书
元旦晚会主持词
2014/03/24 职场文书
《春晓》教学反思
2014/04/20 职场文书
法人身份证明书
2014/10/08 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
法律意见书范文
2015/05/20 职场文书
导游词之岳阳楼
2019/09/25 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL