Go 的map与指针 | 青训营笔记

152 阅读2分钟

Map

  • map也可以叫做哈希或者字典,是实际中最频繁用到的数据结构

map的初始化

  • 使用make()可以创建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"])     // 1
fmt.Println(m["unknown"]) // 0
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

  • 对于slicemap,都可以使用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在取地址的时候在前面添加&,取值和表示指针时在前面添加*