23.5 sync.Map

随着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内存,并且与它所指向的值的大小无关,因为指针变量只是地址的值而已。可以声明指针指向任何类型的值来表明它的原始性或结构性,也可以在指针类型前面加上*号(前缀)来获取指针所指向的内容。