Skip to content

Commit

Permalink
docs: update map
Browse files Browse the repository at this point in the history
  • Loading branch information
duanbiaowu authored Feb 4, 2024
1 parent 5146133 commit 575e4bc
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion content/introduction/map.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,4 +178,32 @@ func main() {
# 并发不安全

最后要说明的很重要的一点是: **`Map` 不是并发安全的,** 也就是说,如果在多个线程中,同时对一个 Map 进行读写,会报错。
[互斥锁](mutex.md) 提供了一个简单的解决方案,后面会专门写一篇文档来说明如何才能 `并发安全`
[互斥锁](mutex.md) 提供了一个简单的解决方案,后面会专门写一篇文档来说明如何才能 `并发安全`

# Map 的 Key 不能是哪些类型?

- 映射(map)
- 切片
- 函数
- 包含不可比较字段的结构体类型
- 元素类型为不可比较类型的数组类型

在键类型的值之间必须可以施加操作符 == 和 != , 换句话说,**键类型的值必须要支持判等操作**

**数组、切片和结构体不能作为 key (含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的),但是指针和接口类型可以。**

**如果要用结构体作为 key 可以提供 `Key()` 和 `Hash()` 方法,这样可以通过结构体的域计算出唯一的数字或者字符串的 key。**

```go
var badMap2 = map[interface{}]int{
"1": 1,
[]int{2}: 2, // 这里会引发panic。
3: 3,
}

// map[type]type 基本类型时,不存在元素不会引起Panic,但统一判断可以作为最佳实践
set := map[string]struct{}{}
if set["hello"] {

}
```

0 comments on commit 575e4bc

Please sign in to comment.