@@ -57,7 +57,7 @@ func main() {
57
57
personSalary[" mike" ] = 9000
58
58
fmt.Println (" personSalary map contents:" , personSalary)
59
59
}
60
- ```
60
+ ```
61
61
62
62
上面的程序输出:` personSalary map contents: map[steve:12000 jamie:15000 mike:9000] ` 。
63
63
@@ -78,13 +78,13 @@ func main() {
78
78
personSalary[" mike" ] = 9000
79
79
fmt.Println (" personSalary map contents:" , personSalary)
80
80
}
81
- ```
81
+ ```
82
82
83
83
上面的程序在声明 personSalary 的同时向其中插入了两个元素。接着插入了一个以 "mike" 为键的元素。程序的输出为:
84
84
85
85
``` golang
86
86
personSalary map contents: map [steve:12000 jamie:15000 mike:9000 ]
87
- ```
87
+ ```
88
88
89
89
` string ` 并不是可以作为键的唯一类型,其他所有可以比较的类型,比如,布尔类型,整型,浮点型,复数类型都可以作为键。如果你想了解更多关于可比较类型的话,请参阅:http://golang.org/ref/spec#Comparison_operators
90
90
@@ -108,7 +108,7 @@ func main() {
108
108
employee := " jamie"
109
109
fmt.Println (" Salary of" , employee, " is" , personSalary[employee])
110
110
}
111
- ```
111
+ ```
112
112
113
113
上面的程序非常简单。员工 ` jamie ` 的工资被取出并打印。程序的输出为:` Salary of jamie is 15000 ` 。
114
114
@@ -131,22 +131,22 @@ func main() {
131
131
fmt.Println (" Salary of" , employee, " is" , personSalary[employee])
132
132
fmt.Println (" Salary of joe is" , personSalary[" joe" ])
133
133
}
134
- ```
134
+ ```
135
135
136
136
上面的程序输出为:
137
137
138
138
``` golang
139
139
Salary of jamie is 15000
140
140
Salary of joe is 0
141
- ```
141
+ ```
142
142
143
143
上面的程序返回 ` joe ` 的工资为` 0 ` 。我们没有得到任何运行时错误说明键 joe 在 ` personSalary ` 中不存在。
144
144
145
145
我们如何检测一个键是否存在于一个 map 中呢?可以使用下面的语法:
146
146
147
147
``` golang
148
148
value , ok := map [key]
149
- ```
149
+ ```
150
150
151
151
上面的语法可以检测一个特定的键是否存在于 map 中。如果 ` ok ` 是 ` true ` ,则键存在,value 被赋值为对应的值。如果 ` ok ` 为 ` false ` ,则表示键不存在。
152
152
@@ -172,13 +172,13 @@ func main() {
172
172
}
173
173
174
174
}
175
- ```
175
+ ```
176
176
177
177
在上面的程序中,第 15 行,` ok ` 应该为 ` false ` ,因为 ` joe ` 不存在。因此程序的输出为:
178
178
179
179
``` golang
180
180
joe not found
181
- ```
181
+ ```
182
182
183
183
range for 可用于遍历 map 中所有的元素(译者注:这里 range 操作符会返回 map 的键和值)。
184
184
@@ -200,7 +200,7 @@ func main() {
200
200
fmt.Printf (" personSalary[%s ] = %d \n " , key, value)
201
201
}
202
202
}
203
- ```
203
+ ```
204
204
205
205
上面的程序输出如下:
206
206
@@ -209,7 +209,7 @@ All items of a map
209
209
personSalary[mike] = 9000
210
210
personSalary[steve] = 12000
211
211
personSalary[jamie] = 15000
212
- ```
212
+ ```
213
213
214
214
值得注意的是,因为 map 是无序的,因此对于程序的每次执行,不能保证使用 range for 遍历 map 的顺序总是一致的。
215
215
@@ -235,14 +235,14 @@ func main() {
235
235
fmt.Println (" map after deletion" , personSalary)
236
236
237
237
}
238
- ```
238
+ ```
239
239
240
240
上面的程序删除以 ` steve ` 为键的元素。程序输出为:
241
241
242
242
``` golang
243
243
map before deletion map [steve:12000 jamie:15000 mike:9000 ]
244
244
map after deletion map [mike:9000 jamie:15000 ]
245
- ```
245
+ ```
246
246
247
247
## map 的大小
248
248
@@ -264,7 +264,7 @@ func main() {
264
264
fmt.Println (" length is" , len (personSalary))
265
265
266
266
}
267
- ```
267
+ ```
268
268
269
269
上面程序中,` len(personSalary) ` 获取 ` personSalary ` 的大小。上面的程序输出:` length is 3 ` 。
270
270
@@ -290,14 +290,14 @@ func main() {
290
290
newPersonSalary[" mike" ] = 18000
291
291
fmt.Println (" Person salary changed" , personSalary)
292
292
}
293
- ```
293
+ ```
294
294
295
295
上面的程序中,第 14 行,` personSalary ` 赋值给 ` newPersonSalary ` 。下一行,将 ` newPersonSalary ` 中 ` mike ` 的工资改为 ` 18000 ` 。那么在 ` personSalary ` 中 ` mike ` 的工资也将变为 ` 18000 ` 。程序的输出如下:
296
296
297
297
``` golang
298
298
Original person salary map [steve:12000 jamie:15000 mike:9000 ]
299
299
Person salary changed map [jamie:15000 mike:18000 steve:12000 ]
300
- ```
300
+ ```
301
301
302
302
将 map 作为参数传递给函数也是一样的。在函数中对 map 的任何修改都会影响在调用函数中看到。
303
303
@@ -319,15 +319,17 @@ func main() {
319
319
if map1 == map2 {
320
320
}
321
321
}
322
- ```
322
+ ```
323
323
324
324
上面的程序将会报错:` invalid operation: map1 == map2 (map can only be compared to nil) ` 。
325
325
326
326
比较两个 map 是否相等的方式是一一比较它们的元素是否相等。我会鼓励你为此编写一个程序,使其工作:)
327
327
328
328
我(原文作者)已经将我们讨论的所有概念汇总到一个程序中,你可以从 [ github] ( https://github.com/golangbot/arraysandslices ) 下载。
329
329
330
- ## 知识扩展
330
+ 希望你喜欢阅读。请留下宝贵的意见和反馈:)
331
+
332
+ ## 以下为扩展知识
331
333
332
334
[ Go编程基础视频教程笔记] ( https://study.163.com/course/courseLearn.htm?courseId=306002#/learn/video?lessonId=421019&courseId=306002 )
333
335
@@ -340,11 +342,12 @@ import (
340
342
)
341
343
342
344
func main (){
343
- // 方式一
344
- var m map [int ]string // 声明一个map
345
+ // 方式一
346
+ var m map [int ]string // 声明一个map,此时的 map == nil
345
347
fmt.Println (m)
346
- m = map [int ]string {} // 初始化一个map
348
+ m = map [int ]string {} // 初始化一个map,此时的 map != nil,是map[]
347
349
fmt.Println (m)
350
+ // 以上两种的区别在于有没有被初始化容量
348
351
349
352
// 方式二
350
353
var m2 map [int ]string = map [int ]string {}
@@ -353,7 +356,18 @@ func main(){
353
356
// 方式三
354
357
m3 := map [int ]string {}
355
358
fmt.Println (m3)
356
-
359
+
360
+ // 方式四
361
+ m4 := map [string ]string {
362
+ " name" :" Tinywan" ,
363
+ " school" :" BAT_UN"
364
+ }
365
+ fmt.Println (m4)
366
+ m5 := make (map [string ][string ])
367
+ m5[" name" ] = " Linux"
368
+ m5[" school" ] = " Unix"
369
+ // 注意:m4和m5两种初始化的方式等价
370
+
357
371
// 设置、获取、删除
358
372
m3[1 ] = " Tinywan"
359
373
a := m3[1 ]
@@ -414,6 +428,4 @@ func main(){
414
428
sort.Ints (slice01)
415
429
fmt.Println (slice01) // 有序的数组:[1 2 3 4 5 6]
416
430
}
417
- ```
418
-
419
- 希望你喜欢阅读。请留下宝贵的意见和反馈:)
431
+ ```
0 commit comments