# 坑

**八进制**

go 里 `0` 开头的常量表示八进制，`7` 以下的十进制与八进制进行位操作，十进制也会被视为八进制

**并发读写map**

无法 `recover` 住，会导致程序 `panic` 后退出。

**并发写全局结构体**

程序读写一个结构体的过程是怎样的？

是直接将整个结构体载入内存或者赋值吗？

不是的，在读结构体时，其实是将结构体的字段一个个加载入寄存器中的

赋值也是，依次给每个字段赋值。这个过程可以从汇编中观察到：

```
// 将 R0 和 R1 寄存器的值分别写入 ab 的地址
00010 (15) MOVD R0, "".ab-32(RSP)
00011 (15) MOVD R1, "".ab-24(RSP)
```

因此，并发写的情况下就会出现问题

如果是并发 append 切片，就可能会出现写入A协程的底层数组地址、B协程的长度，导致切片中出现空值、甚至越界
