其他分享
首页 > 其他分享> > Go Map

Go Map

作者:互联网

目录

 

一、Map声明

1、声明一个 map 的三种方式

二、Map 元素的访问

1、区分不存在的元素和 map 初始化的值

2、与其它主要编程语言的差异

三、Map 遍历

1、map 的遍历方法和数组差不多

四、Map 与工厂模式

1、map 的 value 是一个方法

五、实现 Set

1、Set 的基本功能

2、用 map 实现 set 的功能


一、Map声明

1、声明一个 map 的三种方式

package _map

import "testing"

//map 初始化
func TestMapInit(t *testing.T) {
	//定义一个 map 数据类型,并以 key,value 的格式初始化里面的值,
	m1 := map[string]int{"one":1, "two":2, "three":3}
	//只定义 map,不赋初值,map 的大小也是可以自动伸缩的。
	m2 := map[string]int{}
	//通过 make() 方法定义一个 map,第一个参数是, 第二个参数是容量的大小。
	//如果我们知道容量的大小,可以先设置好,这样性能更好。
	//创建 map 类型,不能向切片一样指定长度,也没办法指定长度
	m3 := make(map[string]int, 10)

	//给 map 某个 key 赋值
	m2["five"] = 5

	t.Log(m1)	//map[one:1 three:3 two:2]
	t.Log(m2)	//map[five:5]
	t.Log(m3)	//map[]

	t.Logf("length m1=%d", len(m1))	//3
	t.Logf("length m2=%d", len(m2))	//1
	//说明通过 make() 创建 map 类型,由于不能只能指定长度,所以 map 的长度为 0
	t.Logf("length m3=%d", len(m3))	//0
	//map 类型不能通过 cap() 函数获取容量的大小,切片类型则可以
	//t.Logf("length m3=%d", cap(m3))
}

二、Map 元素的访问

1、区分不存在的元素和 map 初始化的值

package _map

import "testing"

//元素不存在和其值本来就和不存在的值一样如何做区分
func TestAccessNotExistingKey(t *testing.T)  {
	m1 := map[int]int{}
	m1[2] =0

	//访问一个不存在的 key
	t.Log(m1[1])	//m1[1] 是不存在的,Go会初始化为 0
	//方位一个存在的 key
	t.Log(m1[2])	//m2[1] 是存在的,但是它的值却为0

	//那么如果判断这个 key 是存在还是其值本来就是 0 呢?
	//通过 go 返回值有两个来进行判断,第一个返回值是变量的值,第二个返回值是一个布尔值
	if val, ok := m1[2]; ok {
		t.Logf("m1[2]'s value is:%d", val)
	} else {
		t.Log("m1[2] isn't existing")
	}
	//输出结果:m1[2]'s value is:0




	m2 := map[string]string{}
	m2["two"] = ""

	t.Log(m2["one"])	//m2["one"]不存在,返回空字符串
	t.Log(m2["two"])	//m2["two"]存在,但是其值也是空字符串

	if val, ok := m2["one"]; ok {
		t.Logf("m2['one']'s value is:%s", val)
	} else {
		t.Log("m2['one'] isn't existing")
	}

	//输出结果:m2['one'] isn't existing
}

2、与其它主要编程语言的差异

在访问位的 key 不存在是,仍然会返回 0 或空字符串,不能通过返回 nil 来判断元素是否存在

三、Map 遍历

1、map 的遍历方法和数组差不多

package _map

import "testing"

//map 的遍历,和对数组的遍历写法差不多
func TestMapTravel(t *testing.T) {
	m := map[string]int{"one":1, "two":2, "three":3}

	for key, val := range m{
		t.Log(key, val)
	}
}

四、Map 与工厂模式

1、map 的 value 是一个方法

package _map

import "testing"

//map 的 value 可以是一个方法
func TestMapWithFunValue(t *testing.T)  {
	//map 的 value 可以是一个方法
	m := map[int]func(op int) int {}

	//mp[1] 我们给它赋值为 op
	m[1] = func(op int) int {
		return op
	}
	//mp[2] 我们给它赋值为 op 的平方
	m[2] = func(op int) int {
		return op * op
	}
	//mp[3] 我们给它赋值为 op 的立方
	m[3] = func(op int) int {
		return op * op * op
	}

	//给第一个 key 的函数的参数传值 2,得到的结果也为 2
	t.Log(m[1](2))	//2
	//给第二个 key 的函数的参数传值 2,得到的结果也为 4
	t.Log(m[2](2))	//4
	//给第三个 key 的函数的参数传值 2,得到的结果也为 8
	t.Log(m[3](2))	//8
}

五、实现 Set

Set 可以保证元素的唯一性,但是Go语言中没有 Set 实现,如果需要用 Set 的功能,可以用 map[type]bool 的方式来实现。

1、Set 的基本功能

  1. 元素的唯一性
  2. 添加元素
  3. 判断元素是否存在
  4. 删除元素
  5. 元素的个数

2、用 map 实现 set 的功能

package _map

import "testing"

//用 map 实现 set 的功能
func TestMapAsSet(t *testing.T)  {
	//初始化一个 set
	mySet := map[int]bool{}

	//如果要用 map 来实现 set 的功能,则 value 一定要是布尔值
	mySet[1] = true

	//判断 mySet 中某个元素实付存在
	if mySet[1] {
		t.Log("mySet[1] is exist")
	} else {
		t.Log("mySet[1] isn't exist")
	}
	//结果为:mySet[1] is exist

	//在添加一个元素
	mySet[2] = true

	//获取 mySet 中元素的个数
	t.Log(len(mySet))	//2

	//删除某个 key
	delete(mySet, 1)

	//mySet的长度减少了一个,说明删除成功了
	t.Log(len(mySet))	//1
}

:这篇博文是我学习中的总结,如有转载请注明出处:https://blog.csdn.net/DaiChuanrong/article/details/117966591

 

标签:Map,Log,map,int,mySet,m2,Go,op
来源: https://blog.csdn.net/DaiChuanrong/article/details/117966591