Golang 使用Map实现去重与set的功能操作

 更新时间:2021年04月29日 14:45:35   作者:潘广宇 Leo  
这篇文章主要介绍了Golang 使用 Map 实现去重与 set 的功能操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

假设现在有一个需求

将以下 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类型, 可以自定义实现。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Go单元测试工具gomonkey的使用

    Go单元测试工具gomonkey的使用

    本文主要介绍了Go单元测试工具gomonkey的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 详解Go语言Sync.Pool为何不加锁也能够实现线程安全

    详解Go语言Sync.Pool为何不加锁也能够实现线程安全

    在这篇文章中,我们将剖析sync.Pool内部实现中,介绍了sync.Pool比较巧妙的内部设计思路以及其实现方式。在这个过程中,也间接介绍了为何不加锁也能够实现线程安全,感兴趣的可以学习一下
    2023-04-04
  • Go语言测试库testify使用学习

    Go语言测试库testify使用学习

    这篇文章主要为大家介绍了Go语言测试库testify的使用学习示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go-zero数据的流处理利器fx使用详解

    go-zero数据的流处理利器fx使用详解

    这篇文章主要为大家介绍了go-zero数据的流处理利器fx使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Gorm存在时更新,不存在时创建的问题

    Gorm存在时更新,不存在时创建的问题

    这篇文章主要介绍了Gorm存在时更新,不存在时创建的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 解决golang时间字符串转time.Time的坑

    解决golang时间字符串转time.Time的坑

    这篇文章主要介绍了解决golang时间字符串转time.Time的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang使用正则表达式解析网页

    golang使用正则表达式解析网页

    这篇文章主要介绍了golang使用正则表达式解析网页,需要的朋友可以参考下
    2015-03-03
  • golang中的defer函数理解

    golang中的defer函数理解

    defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源、关闭数据库连接、断开socket连接、解锁一个加锁的资源,这篇文章主要介绍了golang中的defer函数理解,需要的朋友可以参考下
    2022-10-10
  • Go开发go-optioner工具实现轻松生成函数选项模式代码

    Go开发go-optioner工具实现轻松生成函数选项模式代码

    go-optioner 是一个在 Go 代码中生成函数选项模式代码的工具,可以根据给定的结构定义自动生成相应的选项代码,下面就来聊聊go-optioner是如何使用的吧
    2023-07-07
  • 浅析Go语言中数组的这些细节

    浅析Go语言中数组的这些细节

    这篇文章主要为大家详细介绍了Go语言中数组一些细节的相关资料,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以了解一下
    2022-11-11

最新评论