sync.Pool对象池
sync.Pool
pool就是对象缓存池,用来减少堆上内存的反复申请和释放的。因为 golang 的内存是用户触发申请,runtime 负责回收。如果用户申请内存过于频繁,会导致runtime 的回收压力陡增,从而影响整体性能。
有了pool 之后就不一样了,对象申请先看池子里有没有现成的,有就直接返回。释放的时候内存也不是直接归还,而是放进池子而已。适时释放。
这样就能极大的减少申请内存的频率。从而减少gc压力
示例代码:
// 1.初始化sync.Pool对象池,new函数就是创建Person结构体
func initPool() *sync.Pool {
return &sync.Pool{
New: func() interface{} {
fmt.Println("创建一个 person.")
return &Person{}
},
}
}
type Person struct {
Name string
Age int
}
// 主函数,入口函数
func main() {
pool := initPool() //获取对象池
person := pool.Get().(*Person) //获取对象池中一个对象,此时刚初始化,是空对象
fmt.Println("首次从sync.Pool中获取person:", person) //&{ 0}
person.Name = "Jeff"
person.Age = 18
pool.Put(person) //只放入一个对象到对象池中
fmt.Println("设置的对象Name: ", person.Name) //Jeff
fmt.Println("设置的对象Age: ", person.Age) //18
obj1:=pool.Get().(*Person)//从对象池中获取一个对象
fmt.Println(obj1.Name) //Jeff
fmt.Println(obj1.Age) //18
//从对象池中再次获取一个对象,此时没有了。因为对象池中只放入了一个对象
obj2:=pool.Get().(*Person)
fmt.Println(obj2.Name) //空
fmt.Println(obj2.Age) //0
}
总结
pool.Get().(*Person) //获取对象,*Person为对象类型
pool.Put(person) //放入一个对象到对象池
//初始化对象池1
func initPool() *sync.Pool {
return &sync.Pool{
New: func() interface{} {
fmt.Println("创建一个 person.")
return &Person{}
},
}
}
//初始化对象池2
var objPool = sync.Pool{
New: func() interface{} {
return &Person{}
},
}
md5
package pkg
import (
"crypto/md5"
"encoding/hex"
)
var md5Pool = sync.Pool{
New: func() interface{} {
return md5.New()
},
}
func MD5(str string) string {
h := md5.New()
//使用对象池
//h := md5Pool.Get().(hash.Hash)
str = str + "加盐加盐"
h.Write([]byte(str)) // 需要加密的字符串为 123456
cipherStr := h.Sum(nil)
return hex.EncodeToString(cipherStr) // 输出加密结
}
选择了IT,必定终身学习