Map
map也可以叫做哈希或者字典,是实际中最频繁用到的数据结构
map的初始化
m := make(map[string]int)
n := make(map[string]int){"one": 1, "two": 2}
- 其中中括号内声明
map中key的数据类型,中括号后声明map中value的数据类型
- 当没有大括号时,创建的是一个空的map
map的基本操作
m["one"] = 1
fmt.Println(m["one"])
fmt.Println(m["unknown"])
delete(m, "one")
- 可以对
map进行赋值和取值
- 使用
delete()方法删除map中的键值对
- 当key不存在时,
map不会报错,在int类型下会返回0
- Golang中
map是完全无序的,因此遍历时不会按输入顺序或者字母顺序遍历
Go语言的哈希集合
- Go并没有像其他语言一样有hashset,但我们却可以用
map实现hashset
- 关于
struct{}{}的内容后续介绍,这里只需要知道它所占内存空间为0即可
nums := []int{1, 2, 3}
set := make(map[string]struct{}{})
for _, num := range nums {
set[num] = struct{}
}
for num, _ : range set {
fmt.Println(num)
}
- hashset的实现主要利用Golang中空结构体占用内存为0的特点
- hashset本质上是所有value都为空结构体的键值对集合,因此用
map实现
- hashset声明时,
map的value的类型为struct{}{}
- hashset添加时,value类型也为
strct{}{}
- hashset遍历时,只需要考虑key,直接忽略value
Range
- 对于
slice和map,都可以使用range实现遍历,从而使代码更加简洁
nums := []int{1, 2, 3}
for _, num := range nums {
fmt.Println(num)
}
- 对于数组或者切片来说,
range会返回索引值和对应位置的数值
- 如果不需要使用索引值,可以使用下划线
_来忽略
m := make(map[string]int){"one": 1, "two": 2}
for k, v := range m {
fmt.Println("key: ", k, " value: ", v)
}
- 对于
map说,range会返回键值对的key和value
指针
- 相比于C/C++的指针,Go指针的操作有限
- Go的指针主要用途是对于传入的参数进行修改
func swap1(a int, b int) {
tmp := a
a = b
b = tmp
}
func swap2(a *int, b *int) {
tmp := *a
*a = *b
*b = tmp
}
a, b := 1, 2
swap1(a, b)
swap2(&a, &b)
- 经典例子,
swap1()不能交换a和b的值,而swap2()却可以
- 和C/C++一样,Go在取地址的时候在前面添加
&,取值和表示指针时在前面添加*