Go学习之路 (五)Map

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

Map 声明

  • 第一种声明方法(声明之后初始化数据)

    // map[key的类型]value的类型{key:value}
    m := map[string]int{"one": 1, "two": 2, "three": 3}
    // 声明方法(声明一个空map)
    // map[string]int{}
    m1 := map[string]int{}
    m1["one"]=1
    
  • 第二种声明方法make

      // make(map[key的类型]value的类型,capcity(map分配大小空间))
     // capacity是设置初始化容量,map会自动扩容,但扩容会导致内存分配和数据复制,所以如果能够初始化到比较适合的capacity,可以提高性能。
      make(map[string]int,10)   
    

贴个小demo

package testmap

import (
    "testing"
    "strconv"
)

func TestInitMap(t *testing.T) {
    m1 := map[string]int{"one": 1, "two": 2, "sere": 3}
    m2 := map[string]int{}
    //m2["一"] = 1
    m3 := make(map[int]int, 10)
    for i:=0;i<10;i++{
        m3[i]=i
        m2[strconv.Itoa(i)]=i
    }
    t.Log(m1, len(m1))
    t.Log(m2, len(m2))
    t.Log(m3, len(m3))
}

运行结果

map[two:2 sere:3 one:1] 3
map[1:1 3:3 4:4 5:5 8:8 0:0 2:2 6:6 7:7 9:9] 10
map[5:5 8:8 1:1 3:3 4:4 7:7 9:9 0:0 2:2 6:6] 10

Map元素的访问

  • 与其他主要编程语言的差异
  • 在访问的 Key 不存在时,仍会返回零值,不能通过返回 nil 来判断元素是否存在

举个例子

package testmap

import (
    "testing"
)
func TestAccessNotExistingKey(t *testing.T) {
    m1 := map[int]int{}
    t.Log(m1[1])
    m1[2] = 0
    t.Log(m1[2])
    m1[3]=0
    if v, ok := m1[3]; ok {
        t.Logf("Key 3's value is %d", v)
    } else {
        t.Log("Key 3 is not existing.")
    }
}

运行结果

// 这里没有添加m1[3]=0的结果
0
0
Key 3 is not existing.
// 这里是添加了m1[3]=0的结果
0
0
Key 3's value is 0

Map 的遍历

func TestTravelMap(t *testing.T){
    m1 := map[string]int{"one": 1, "two": 2, "sere": 3}
    for k,v :=range m1{
        t.Log(k,v)
    }
}

运行结果

one 1
two 2
sere 3

Map 与 工厂模式

  • Map 的 value 可以是一个方法
  • 与 Go 的 Dock type 接口方式一起,可以方便的实现单一方法对象的工厂模式
package map_ext
func TestMapWithFunValue(t *testing.T){
  m :=map[int]func(op int) int{}
  m[1] = func(op int) int{ return op}
  m[2] = func(op int) int{ return op*op}
  m[3] = func(op int) int{ return op*op*op}
  t.Log(m[1](2),m[2](2),m[3](2))
}

运行结果:

2 4 8

用 Map 实现 Set

在 Go 语言中是没有提供 Set 这个内置函数的,所以在平时使用时,我们可以用 map[type]bool来实现 Set

  • 元素的唯一性
  • 基本操作
    • 添加元素
    • 判断元素是否存在
    • 删除元素
    • 元素个数
package map_ext
func TestMapForSet(t *testing.T){
  mySet :=map[int]bool{}
  mySet[1]=true
  n := 1
  if mySet[n]{
    t.Logf("%d is existing",n)
  }else{
    t.Logf("%d is not existing",n)
  }
  mySet[3]=true
  t.Log(len(mySet))
  delete(mySet,1) // 删除mySet这个map下 key=1的键值对
  if mySet[n]{
    t.Logf("%d is existing",n)
  }else{
    t.Logf("%d is not existing",n)
  }
}

运行结果

1 is existing
2
1 is not existing

你可能感兴趣的:(Go学习之路 (五)Map)