Skip to content

Commit

Permalink
GO中常用集合(下)学习笔记
Browse files Browse the repository at this point in the history
SOYANGA committed Sep 6, 2019
1 parent 007679f commit 0d37d37
Showing 1 changed file with 197 additions and 0 deletions.
197 changes: 197 additions & 0 deletions note/06-GO中常用集合(下).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
# 06-GO中常用集合(下)

## Map声明与初始化



```go
var Mymap map[string] int //单纯的声明
m := map[string] int{"one" : 1,
"two" : 2,
"three" : 3} //初始化+声明

m1 := map[string] int{} ////初始化+声明
m1["one"] = 1 /*往map中添加一个键值对*/

m2 := make(map[string]int, 10/* Initial Capacity*/)
```



## Map初始化

```go
/*
map的声明及初始化
*/
func TestInitMap(t *testing.T) {
m1 := map[int]int{1: 1, 2: 4, 3: 9}
t.Log(m1[2]) //4
t.Logf("len m1 = %d", len(m1)) //len m1 = 3

m2 := map[int]int{} //初始化为空的map
m2[4] = 16 //设定其中某个元素
t.Logf("len m2 = %d", len(m2)) //len m2 = 1

m3 := make(map[int]int, 2)
t.Logf("len m3 = %d", len(m3)) //len m3 = 0 cap()不能用于求map的容量
}
```



## Map元素的访问

与其他主要编程语言的差异

在访问的Key不存在时,仍会返回零值,不能通过返回nil来判断元素是否存在

要通过map键值返回值中的是否查找到(bool变量来查看键值是否存在)

```go
/*
判断map中查询的值是否存在
*/
func TestAccessNotExistingKey(t *testing.T) {
m1 := map[int]int{}
t.Log(m1[1]) //0

m1[2] = 0
t.Log(m1[2]) //0

//m1[3] = 0
if v, ok := m1[3]; ok {
t.Logf("key 3's value is %d", v) //key 3's value is 0
} else {
t.Log("Key 3 is not existing")
}
}
```



## Map遍历

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

***Map遍历 range 返回的两个值分别是key和value***

```go
/*
Map遍历 range 返回的两个值分别是key和value
*/
func TestTravelMap(t *testing.T) {
m1 := map[int]int{1: 1, 2: 4, 3: 9}
for k, v := range m1 {
t.Log(k,v)
}
}
//map_test.go:46: 2 4
//map_test.go:46: 3 9
//map_test.go:46: 1 1
```



## Map的元素删除

delete()方法,用于删除容器内的元素

```go
delete(myMap, "1234")
```

**如果键值不存在的化那么调用这个方法什么都不会发生,如果传入的map变量是nil,该调用将导致程序抛出异常(painc)**

```go
/*
Map元素的删除
*/
func TestDeleteMap(t *testing.T) {
m1 := map[int]int{1: 1, 2: 4, 3: 9}
delete(m1, 1)
t.Log(m1) //map[2:4 3:9]
//delete(nil, "1") //first argument to delete must be map; have nil
}
```



## Map与工厂模式

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



value可以是一个方法

```go
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
}
```





## 实现Set 利用Map的key存储Set的value

Go的内置集合中没有Set实现,可以`map[type]bool`

1. 元素的唯一性
2. 基本操作
- 添加元素
- 判断元素是否存在
- 删除元素
- 元素个数

```go
/*
利用map实现Set
1. 添加元素
2. 判断是否存在
3. 删除元素
4. 元素个数
*/
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) //3 is not existing
}

//元素个数
mySet[3] = true
t.Log(len(mySet)) //2

//删除元素
delete(mySet, 1)
t.Log(len(mySet)) //1
n = 1
if mySet[n] {
t.Logf("%d is existing", n)
} else {
t.Logf("%d is not existing", n) // 1 is not existing
}
}
```

0 comments on commit 0d37d37

Please sign in to comment.