前言
sync.Pool
是臨時物件池,儲存的是臨時物件,不可以用它來儲存 socket
長連線和資料庫連線池等。
sync.Pool
本質是用來儲存和複用臨時物件,以減少記憶體分配,降低 GC 壓力,比如需要使用一個物件,就去 Pool 裡面拿,如果拿不到就分配一份,這比起不停生成新的物件,用完了再等待 GC 回收要高效的多。
sync.Pool
sync.Pool
的使用很簡單,看下示例程式碼:
package student
import (
"sync"
)
type student struct {
Name string
Age int
}
var studentPool = &sync.Pool{
New: func() interface{} {
return new(student)
},
}
func New(name string, age int) *student {
stu := studentPool.Get().(*student)
stu.Name = name
stu.Age = age
return stu
}
func Release(stu *student) {
stu.Name = ""
stu.Age = 0
studentPool.Put(stu)
}
當使用 student
物件時,只需要呼叫 New()
方法獲取物件,獲取之後使用 defer
函式進行釋放即可。
stu := student.New("tom", 30)
defer student.Release(stu)
// 業務邏輯
...
關於 sync.Pool
裡面的物件具體是什麼時候真正釋放,是由系統決定的。
小結
- 一定要注意儲存的是臨時物件!
- 一定要注意
Get
後,要呼叫Put
!
以上,希望對你能夠有所幫助。