-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
1 changed file
with
197 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} | ||
``` | ||
|