Метод sync.Pool.Put
Метод Put структуры sync.Pool возвращает объект обратно в пул.
В качестве единственного параметра он принимает объект, который необходимо вернуть.
Возвращаемое значение отсутствует. После вызова Put объект становится
доступным для повторного использования через метод Get.
Синтаксис
pool.Put(obj)
Пример
Рассмотрим базовый пример использования пула с возвратом объекта:
package main
import (
"fmt"
"sync"
)
func main() {
pool := &sync.Pool{
New: func() interface{} {
return "default value"
},
}
obj := pool.Get()
fmt.Println(obj)
pool.Put("custom value")
obj = pool.Get()
fmt.Println(obj)
}
Результат выполнения кода:
"default value"
"custom value"
Пример
Покажем, как Put позволяет переиспользовать объекты с состоянием:
package main
import (
"fmt"
"sync"
)
func main() {
pool := &sync.Pool{
New: func() interface{} {
return make([]byte, 1024)
},
}
buf := pool.Get().([]byte)
copy(buf, "abcde")
fmt.Println(string(buf[:5]))
pool.Put(buf)
newBuf := pool.Get().([]byte)
fmt.Println(string(newBuf[:5]))
}
Результат выполнения кода:
"abcde"
"abcde"
Пример
Важно сбрасывать состояние объекта перед возвратом в пул:
package main
import (
"fmt"
"sync"
)
func main() {
pool := &sync.Pool{
New: func() interface{} {
return make([]string, 0, 10)
},
}
slice := pool.Get().([]string)
slice = append(slice, "a", "b", "c")
fmt.Println(slice)
slice = slice[:0]
pool.Put(slice)
newSlice := pool.Get().([]string)
fmt.Println(newSlice)
}
Результат выполнения кода:
[a b c]
[]
Смотрите также
-
структуру
sync.Pool,
которая предоставляет пул временных объектов -
метод
sync.Pool.Get,
который извлекает объект из пула -
блокировку
sync.Mutex,
которая обеспечивает взаимное исключение -
механизм
горутин,
которые могут безопасно использовать пулы