0%

Golang

GPM

goroutine调度器

并发包

unsafe.Pointer

unsafe.Pointer

golang作为强类型静态语言,不允许指针类型转换。所以有了unsafe.Pointer,相当C语言中的void *

四个规则:

  1. 任何指针都可以转换为unsafe.Pointer
  2. unsafe.Pointer可以转换为任何指针
  3. uintptr可以转换为unsafe.Pointer
  4. unsafe.Pointer可以转换为uintptr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func main() {
u:=new(user)
fmt.Println(*u)

pName:=(*string)(unsafe.Pointer(u))
*pName="张三"

pAge:=(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(u))+unsafe.Offsetof(u.age)))
*pAge = 20

fmt.Println(*u)
}

type user struct {
name string
age int
}

要注意的是,uintptr不能作为临时变量,GC可能会产生潜在问题

atomic.Value

sync.Map

sync.Pool

sync.Pool

保存和复用临时对象,减少内存分配,降低GC压力。