Skip to content

Commit 9a4fdba

Browse files
committed
update lesson15
1 parent bf4ed0b commit 9a4fdba

File tree

5 files changed

+179
-2
lines changed

5 files changed

+179
-2
lines changed

workspace/lesson15/map1.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
var dict map[string]int = map[string]int{}
7+
dict["a"] = 1
8+
fmt.Println(dict)
9+
10+
var dict2 = map[string]int{}
11+
dict2["b"] = 2
12+
fmt.Println(dict2)
13+
14+
dict3 := map[string]int{"test":0}
15+
dict3["c"] = 3
16+
fmt.Println(dict2)
17+
18+
dict4 := make(map[string]int)
19+
dict4["d"] = 4
20+
fmt.Println(dict4)
21+
}

workspace/lesson15/map2.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
// 构造一个map
7+
str := "aba"
8+
dict := map[rune]int{}
9+
for _, value := range str{
10+
dict[value]++
11+
}
12+
fmt.Println(dict) // map[97:2 98:1]
13+
14+
// 访问map里不存在的key,并不会像C++一样自动往map里插入这个新key
15+
value, ok := dict['z']
16+
fmt.Println(value, ok) // 0 false
17+
fmt.Println(dict) // map[97:2 98:1]
18+
19+
// 访问map里已有的key
20+
value2 := dict['a']
21+
fmt.Println(value2) // 2
22+
}

workspace/lesson15/map3.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
dict := map[string]int{"a":1, "b":2}
7+
fmt.Println(dict)
8+
9+
// 删除"a"这个key
10+
delete(dict, "a")
11+
fmt.Println(dict)
12+
13+
// 删除"c"这个不在的key,对map结果无影响
14+
delete(dict, "c")
15+
fmt.Println(dict)
16+
}

workspace/lesson15/readme.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,115 @@
22

33
## 定义
44

5+
* 语法
6+
7+
```go
8+
var map_var map[key_data_type]value_data_type = map[key_data_type]value_data_type{}
9+
10+
var map_var = map[key_data_type]value_data_type{}
11+
12+
map_var := map[key_data_type]value_data_type{}
13+
14+
map_var := make(map[key_data_type]value_data_type)
15+
```
16+
17+
* 示例
18+
19+
```go
20+
package main
21+
22+
import "fmt"
23+
24+
func main() {
25+
var dict map[string]int = map[string]int{}
26+
dict["a"] = 1
27+
fmt.Println(dict)
28+
29+
var dict2 = map[string]int{}
30+
dict2["b"] = 2
31+
fmt.Println(dict2)
32+
33+
dict3 := map[string]int{"test":0}
34+
dict3["c"] = 3
35+
fmt.Println(dict2)
36+
37+
dict4 := make(map[string]int)
38+
dict4["d"] = 4
39+
fmt.Println(dict4)
40+
}
41+
```
42+
43+
44+
545
## 使用
646

47+
* 判断key在map里是否存在
48+
49+
* 语法。
50+
51+
```go
52+
value, is_exist := map[key]
53+
```
54+
55+
如果key存在,那is_exist就是true, value是对应的值。否则is_exist就是false, value是map的value数据类型的默认值。
56+
57+
**注意**: 如果key不存在,通过map[key]访问不会给map自动插入这个新key。C++是会自动插入新key的,两个语言不一样。如果确定key存在,可以直接使用map[key]拿到value。
58+
59+
* 示例
60+
61+
```go
62+
package main
63+
64+
import "fmt"
65+
66+
func main() {
67+
// 构造一个map
68+
str := "aba"
69+
dict := map[rune]int{}
70+
for _, value := range str{
71+
dict[value]++
72+
}
73+
fmt.Println(dict) // map[97:2 98:1]
74+
75+
// 访问map里不存在的key,并不会像C++一样自动往map里插入这个新key
76+
value, ok := dict['z']
77+
fmt.Println(value, ok) // 0 false
78+
fmt.Println(dict) // map[97:2 98:1]
79+
80+
// 访问map里已有的key
81+
value2 := dict['a']
82+
fmt.Println(value2) // 2
83+
}
84+
```
85+
86+
87+
88+
* 遍历map:使用range迭代,参见[lesson14](../lesson14)
89+
790
## delete函数
891

92+
* 删除key,参数为map和对应的key。允许删除一个不存在的key,对map无任何影响。
93+
94+
```go
95+
package main
96+
97+
import "fmt"
98+
99+
func main() {
100+
dict := map[string]int{"a":1, "b":2}
101+
fmt.Println(dict) // map[a:1 b:2]
102+
103+
// 删除"a"这个key
104+
delete(dict, "a")
105+
fmt.Println(dict) // map[b:2]
106+
107+
// 删除"c"这个不在的key,对map结果无影响
108+
delete(dict, "c")
109+
fmt.Println(dict) // map[b:2]
110+
}
111+
```
112+
113+
114+
9115

10116

workspace/lesson2/readme.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,19 @@
2424
* bool
2525

2626
* 其它数字类型
27-
* byte:类似uint8,数据范围0-255,定义的时候超过这个范围会编译报错
28-
* rune:类似int32,数据范围-2147483648-2147483647
27+
* byte:等价于uint8,数据范围0-255,定义的时候超过这个范围会编译报错
28+
* rune:等价于int32,数据范围-2147483648-2147483647
29+
* 字符串里的每一个字符的类型就是rune类型,或者说int32类型
2930
* uint:32位或64位
3031
* uintptr: 无符号整数,是内存地址的整数表示形式,应用代码一般用不到(https://stackoverflow.com/questions/59042646/whats-the-difference-between-uint-and-uintptr-in-golang)
32+
33+
* reflect包的TypeOf函数可以用来获取数据的类型
34+
35+
```go
36+
var b byte = 10
37+
var c = 'a'
38+
fmt.Println(reflect.TypeOf(b)) // uint8
39+
fmt.Println(reflect.TypeOf(c)) // int32
40+
```
41+
42+

0 commit comments

Comments
 (0)