一个例子引发的思考
`
func getUserId(userids []string) map[string]int {
counts := make(map[string]int)
for _, userid := range userids
{ count := counts[userid] count++ counts[userid] = count }
return counts }`
这个函数叫做 getUserId,它的目的是计算输入切片(slice)userids 中每个用户ID出现的次数,并将结果作为一个 map 返回。
我们逐步解析这个函数:
-
输入参数:
userids []string: 这是一个字符串的切片,每个字符串代表一个用户ID。
-
初始化一个空的 map:
counts := make(map[string]int)这里我们创建了一个名为
counts的 map,它的键是字符串(即用户ID),而值是整数(表示该用户ID出现的次数)。 -
遍历
userids切片:for _, userid := range userids {我们使用
range对userids切片进行迭代,每次迭代将用户ID赋值给userid。 -
计算每个用户ID的出现次数:
count := counts[userid] count++ counts[userid] = countcount := counts[userid]: 获取当前用户ID的计数。如果该用户ID尚未存在于 map 中,该值将为 0。count++: 增加该用户ID的计数。counts[userid] = count: 更新 map 中该用户ID的计数。
-
返回计数:
return counts最后,函数返回
countsmap,该 map 包含每个用户ID及其出现的次数。
这个函数用于统计 userids 切片中每个用户ID的出现次数,并以 map 的形式返回。
手操运行
假设我们有以下用户ID切片:
userids := []string{"Alice", "Bob", "Alice", "Charlie", "Bob", "Alice", "David", "David"}
这个切片中有些用户ID出现了不止一次。我们想知道每个用户ID分别出现了多少次。
调用函数:
result := getUserId(userids)
函数的运行过程:
- 初始化一个空的
countsmap。 - 遍历切片中的第一个用户ID "Alice",看 map 中是否有 "Alice"。没有,所以 "Alice" 的计数是 0。
- 增加 "Alice" 的计数(0 + 1 = 1),然后在 map 中存储 "Alice":1。
- 接着遍历 "Bob"。用同样的方法处理。所以最后 map 中有 "Bob":1。
- 再次遇到 "Alice",现在 map 中 "Alice" 的计数是 1。所以再增加一次,变为 2。
- ... 继续这个过程,直到遍历完整个切片。
当函数执行完毕后,result 的值将是:
{
"Alice": 3,
"Bob": 2,
"Charlie": 1,
"David": 2
}
所以,通过这个函数,我们知道在给定的 userids 切片中,Alice 出现了3次,Bob 出现了2次,Charlie 出现了1次,而 David 出现了2次。