假设现在有一个需求
将以下 url 保存起来,要求不重复www.baidu.comwww.sina.com.cnwww.hao123.comwww.baidu.comwww.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 mainimport ( 'fmt')// map[keyType]valueTypefunc initMap() { // 通过make方法创建 dict := make(map[string]int) dict['age'] = 18 // 直接创建 dict2 := map[string]string{'name':'xiaoming', 'phone':'135xxx'} dict2['addr'] = 'Guangzhou' fmt.Printf('%vn', dict2)}func main() { initMap()}3. 元素访问
package mainimport ( '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('%vn', map1)}func main() { useMap()}4. 在函数中传递map
在函数间传递map对象, 是传递引用而不是拷贝; 因此在函数中对map进行了修改, 引用到它的地方也会相应修改
package mainimport ( '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: %vn', m)}func main() { useMap()}Set类型
golang没有内置Set类型, 可以自定义实现。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持乐呵呵网。如有错误或未考虑完全的地方,望不吝赐教。