v是副本而非引用修改v不影响原切片改原切片须用索引s[i]结构体切片中v.Fieldx无效map遍历顺序随机需显式排序key并发读写map会panicstring遍历中i是字节偏移而非字符序号。range 遍历切片时改不了原值因为 v 是副本直接说结论v 是每次迭代复制出来的值不是引用。你写 v v * 2只改了那个临时变量原切片纹丝不动。要修改原切片元素必须用索引写成 for i : range s { s[i] s[i] * 2 } 或 for i, v : range s { s[i] v * 2 }结构体切片尤其危险——v.Field x 不会生效除非 v 字段本身是指针或 slice如果只是读取、计算、打印for _, v : range s 完全没问题但凡涉及“写”就别碰 v 赋值range 遍历 map 顺序每次都不同这不是 bugGo 明确规定 range 遍历 map 的起始哈希桶是随机的所以键的输出顺序不固定——这是防你依赖顺序写的代码侥幸跑通。测试里偶尔顺序一致别信生产环境大概率变需要稳定顺序比如日志输出、JSON 序列化得先收集 keykeys : make([]string, 0, len(m)); for k : range m { keys append(keys, k) }再 sort.Strings(keys)最后 for _, k : range keys { fmt.Println(k, m[k]) }并发读写 map 时用 range 会 panicfatal error: concurrent map iteration and map write必须加锁或换 sync.Maprange 遍历字符串返回的是 rune 起始字节位置不是字符序号range 遍历 string 时i 是该 rune 在字节序列里的起始偏移不是第几个字符c 才是解码后的 Unicode 字符。中文、emoji 等多字节字符会让 i 跳跃比如 你好 中第二个字的 i 是 3不是 1想统计字符个数用 utf8.RuneCountInString(s)别靠 range 循环计数器如果只是查 ASCII 字符如 a、做字节级操作用 for i : 0; i 更快绕过 UTF-8 解码开销range 读 channel 会一直阻塞直到 closefor v : range ch 这句看似简单实则隐含阻塞语义它会卡住直到有数据可读通道关闭后自动退出循环。 WisPaper 复旦大学研发的AI学术搜索工具5分钟内筛选1000篇论文