下面代码里的 counter 的输出值?
func main() {
var m = map[string]int{
"A": 21,
"B": 22,
"C": 23,
}
counter := 0
for k, v := range m {
if counter == 0 {
delete(m, "A")
}
counter++
fmt.Println(k, v)
}
fmt.Println("counter is ", counter)
}
- A. 2
- B. 3
- C. 2 或 3
打卡
map引用传递
ok
map 是在哈希散列表,当使用 for range 时是无序的
for range map 是无序的
mk
mark
mark
func main() { var m = map[string]int{ "A": 21, "B": 22, "C": 23, } counter := 0 for k, v := range m { if counter == 0 { delete(m, "A") } counter++ fmt.Println(k, v) } fmt.Println("counter is ", counter) }
for range map 是无序的,如果第一次循环到 A,则输出 3;否则输出 2。
mark
for range map是无序的
range map 未指定遍历次数 https://cloud.tencent.com/developer/article/1876243
硬核解答,点赞。
多谢老板
for range遍历切片时,循环次数是确定的,因此在循环体内改变切片结构对循环结果不影响;而for range遍历map时,循环次数是不确定的,循环体内对map的修改会在结果上反映出来
mark
mark
for range map 是无序的,如果第一次循环到 A,则输出 3;否则输出 2。
新年快乐
slice、map都引用传递
mark
Mark
我每天收集整理的每日一练 https://github.com/RobertWang/golang_study
欢迎大家来补充
Mark
打卡
mark
mark
for range map 是无序的, slice、map都引用传递
mark
因为map是无序的,所以在range遍历中不知道A是第一个出现往后才出现了!关键点是map的底层原理桶是指针类型的 删除的情况不发生扩容原map是跟着变化的
打卡
应该是三个全部都会输出 分析:在使用 delete(m, "A") 删除的时候并没用跳出循环,在当前循环是 k,v 是已经存在的, map本身是无序的,但是 for range根据循环对象本身的序列顺序进行遍历 所以第一次输出的一定是A
mark
mark
C. 2 或 3
m
mark:map引用传递,同时无序,所以二或三
mark
mark
1