性能提升秘籍:Golang对象池与复用技术,GC不再是瓶颈!
前戏 小白: 老花, 我今天想了解下 golang 的对象复用是干啥用的? 老花: 对象复用, 顾名思义, 就是把对象进行复用, 而不是每次都重新创建一个对象, 这样可以减少内存的开销, 提高性能, 减少 GC 的次数。 对象复用如何使用? golang的对象复用主要是要sync.Pool实现, 它是并发安全的对象池。 首先, 声明对象池, 需要提供一个对象的构造函数 New: var pool = sync.Pool{ New: func() interface{} { return new(MyType) // MyType 是你想要复用的对象类型 }, } 当从对象池中获取对象时,如果池中没有可用对象,会调用 New 函数创建一个新的对象。 使用 Get 方法从对象池中获取对象,使用 Put 方法将对象放回对象池。 obj := pool.Get().(*MyType) pool.Put(obj) 不过项目中, 我们都会简单地进行封装使用: var dataPool sync.Pool type UserData struct { Data []byte Key string } func GetUserData() *UserData { si := dataPool.Get() if si == nil { return &UserData{} } return si.(*UserData) } func PutUserData(si *UserData) { if si == nil { return } dataPool.Put(si) } 这样, 我们只需要使用GetUserData 和 PutUserData 就可以了。 ...