10丨Map 声明、元素访问及遍历 & 11丨Map与工厂模式,在Go语言中实现Set

10丨Map 声明、元素访问及遍历

Map声明

m := map[string]int{"one": 1, "two": 2, "three": 3}
m1 := map[string]int{}
m1["one"] = 1
m2 := make(map[string]int, 10 /*Initial Capacity*/)
//为什么不初始化len? 切片的len会赋默认的0值,map无法做到

 

Map元素的访问

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

if v, ok := m["four"]; ok {
 t.Log("four", v)
} else {
 t.Log("Not existing")
}

 

Map遍历

m := map[string]int{"one": 1, "two": 2, "three": 3}
for k, v := range m {
 t.Log(k, v)
}

测试代码

package ch7

import (
    "testing"
)

// map 的定义
func TestIntMap(t *testing.T) {
    m1 := map[int]int{1: 1, 2: 2, 3: 9}
    t.Log(m1[2]) //2
    t.Logf("len m1=%d", len(m1)) //len m1=3

    m2 := map[int]string{}
    m2[4] = "lewen"
    t.Logf("len m2=%d", len(m2))  // len m2=1

    m3 := make(map[int]int, 10)  // 10 是map容量
    t.Logf("len m3=%d", len(m3)) // len m3=0        ,cap(m3)) 不可以

}

// 访问不存在的值
func TestAccessNotExistingKey(t *testing.T) {
    m1 := map[int]int{}
    t.Log(m1[1]) //不存在,返回0值

    m1[2] = 0
    t.Log(m1[2])   // 存在本身为0值

    if v, bol := m1[3]; bol {          // v为值  , bol 为 true 该值存在,False 该值不存在        判断值的正确方式
        t.Log(bol)
        t.Logf("key 3's value is %d", v)
    } else {
        t.Log(bol)
        t.Log("key 3 is not existing.")
    }

}

// map 的遍历

func TestTravelMap(t *testing.T) {
    m1 := map[int]int{1: 1, 2: 2, 3: 9}
    for k, v := range m1 {
        t.Log(k, v)
    }
    /*map_test.go:47: 1 1
      map_test.go:47: 2 2
      map_test.go:47: 3 9*/
}

 

11丨Map与工厂模式,在Go语言中实现Set

Map与工厂模式

  • Map的vaue可以是一个方法
  • 与Go的 Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式

实现Set

Go的内置集合中没有Set实现,可以 map [type] bool
1.元素的唯一性
2.基本操作

  • 1)添加元素
  • 2)判断元素是否存在
  • 3)删除元素
  • 4)元素个数

代码示例

package ch8

import "testing"

func TestMapWithFunValue(t *testing.T) {
    m := map[int]func(arg int) int{}
    //     key  value是个函数 返回值
    m[1] = func(arg int) int { return arg }
    m[2] = func(arg int) int { return arg * arg }
    m[3] = func(arg int) int { return arg * arg * arg }
    t.Log(m[1](2), m[2](2), m[3](2))      //  map_test.go:56: 2 4 8

}

func TestMapForSet(t *testing.T) {
    mySet := map[int]bool{}
    mySet[1] = true
    n := 3

    if mySet[n] {
        t.Logf("%d is existing", n)
    } else {
        t.Logf("%d is not existing ", n)
    }
    mySet[3] = true
    t.Log(len(mySet))  //2

    delete(mySet, 1) // 指定要删掉的key
    /*    map_test.go:76: 3 is not existing
        map_test.go:79: 2*/
    m := 1

    if mySet[m] {
        t.Logf("%d is existing", m)
    } else {
        t.Logf("%d is not existing ", m)
    }
}

 

posted @ 2021-01-21 20:38  元贞  阅读(84)  评论(0)    收藏  举报