Go语言入门到实战——07.Go语言Map的声明,元素访问和遍历及其扩展应用

Go语言入门到实战——00主目录
在上一讲中我们学习了Go语言的数组和切片的知识。

一.Map的声明

package test

import "testing"

func TestMap(t *testing.T) {
	m := map[int]int{1: 1, 2: 2, 3: 3}
	t.Logf("len of m: %d", len(m))
	t.Log(m[1])
	t.Log(m[0]) //选择不存在的key,默认初值,但是不会增加m的长度
	t.Logf("len of m: %d", len(m))
	m[0] = 0
	t.Log(m[0]) //插入新的值,长度变为4
	t.Logf("len of m: %d", len(m))
	m2 := make(map[int]int, 10)
	t.Logf("len of m2: %d", len(m2))
	//t.Log(cap(m2))会报错
}

Go语言入门到实战——07.Go语言Map的声明,元素访问和遍历及其扩展应用_第1张图片
从上面我们就会发现,go语言我们不能通过map返回值是否为nil来判断是否存在对应的key,因为会赋0值,思考一个问题,我们应该怎么去区分一个key是否存在呢?例子如下:

package test

import "testing"

func TestMap(t *testing.T) {
	m := map[int]int{}
	if v, ok := m[1]; ok {
		t.Logf("key 1's val is %d", v)
	} else {
		t.Log("key 1 is not existing")
	}
}

Go语言入门到实战——07.Go语言Map的声明,元素访问和遍历及其扩展应用_第2张图片

二.Map的遍历

package test

import "testing"

func TestMap(t *testing.T) {
	m := map[int]int{1: 1, 2: 2, 3: 3}
	for k, v := range m {
		t.Log(k, v)
	}
}

Go语言入门到实战——07.Go语言Map的声明,元素访问和遍历及其扩展应用_第3张图片

三.Map扩展应用

1.map的value可以是函数
2.使用map实现set集合
3.map与duck type接口结合实现单一方法对象的工厂模式(这个在后面章节会讲到,这里只是提一下)

1.value是函数

package test
import "testing"
func TestMap(t *testing.T) {
	m := map[int]func(n int) int{} //key是int,value是参数为int,返回值为int的函数
	m[1] = func(n int) int { return n }
	m[2] = func(n int) int { return n * n }
	m[3] = func(n int) int { return n * n * n }
	t.Log(m[1](2), m[2](2), m[3](2))
}

Go语言入门到实战——07.Go语言Map的声明,元素访问和遍历及其扩展应用_第4张图片
2.map实现set
go语言没有给我们提供set,但是我们可以自己使用map[type]bool来实现
实现set我们需要注意下面的几点:

1.保证元素的唯一性
2.实现基本的操作
	添加元素
	删除元素
	判断元素是否存在
	获取元素个数
package test

import "testing"

func TestMap(t *testing.T) {
	mySet := map[int]bool{}
	//1.添加元素
	mySet[1] = true
	mySet[2] = true
	//2.判断元素存在
	if mySet[1] {
		t.Log("存在")
	} else {
		t.Log("不存在")
	}
	//3.获取元素的个数
	t.Logf("set集合的元素个数是: %d", len(mySet))
	//4.删除元素
	delete(mySet, 1)
	for k := range mySet {
		t.Log(k)
	}
}

Go语言入门到实战——07.Go语言Map的声明,元素访问和遍历及其扩展应用_第5张图片

你可能感兴趣的:(linux,go语言,vscode)