随着Go1.9的发布,有了一个新的特性,那就是sync.map,它是原生支持并发安全的map。虽然说普通map并不是线程安全(或者说并发安全),但一般情况下我们还是使用它,因为这足够了;只有在涉及到线程安全,再考虑sync.map。
但由于sync.Map的读取并不是类型安全的,所以我们在使用Load读取数据的时候我们需要做类型转换。
sync.Map的使用上和map有较大差异,详情见代码。
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
//Store
m.Store("name", "Joe")
m.Store("gender", "Male")
//LoadOrStore
//若key不存在,则存入key和value,返回false和输入的value
v, ok := m.LoadOrStore("name1", "Jim")
fmt.Println(ok, v) //false Jim
//若key已存在,则返回true和key对应的value,不会修改原来的value
v, ok = m.LoadOrStore("name", "aaa")
fmt.Println(ok, v) //true Joe
//Load
v, ok = m.Load("name")
if ok {
fmt.Println("key存在,值是: ", v)
} else {
fmt.Println("key不存在")
}
//Range
//遍历sync.Map
f := func(k, v interface{}) bool {
fmt.Println(k, v)
return true
}
m.Range(f)
//Delete
m.Delete("name1")
fmt.Println(m.Load("name1"))
}
程序运行输出:
false Jim
true Joe
key存在,值是: Joe
name Joe
gender Male
name1 Jim
<nil> false
下一节:一个指针变量可以指向任何一个值的内存地址。指针变量在 32 位计算机上占用 4B 内存,在 64 位计算机占用 8B内存,并且与它所指向的值的大小无关,因为指针变量只是地址的值而已。可以声明指针指向任何类型的值来表明它的原始性或结构性,也可以在指针类型前面加上*号(前缀)来获取指针所指向的内容。