go / intermediate
Snippet
Wiederverwendung von zugewiesenem Arbeitsspeicher mit sync.Pool
Die Verwendung von sync.Pool ermöglicht das Recycling temporärer Objekte, was die Belastung des Garbage Collectors (GC) bei Operationen mit hohem Durchsatz erheblich reduziert. Der Pool speichert temporär ungenutzte Puffer und gibt sie bei Bedarf zurück.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package mainimport ("bytes""fmt""sync")var bufPool = sync.Pool{New: func() any {return new(bytes.Buffer)},}func process(val string) {buf := bufPool.Get().(*bytes.Buffer)defer func() {buf.Reset()bufPool.Put(buf)}()buf.WriteString("Processed: ")buf.WriteString(val)fmt.Println(buf.String())}func main() {process("hello")process("world")}
Erklärung
1
var bufPool = sync.Pool{
Deklariert einen globalen sync.Pool und definiert eine Konstruktor-Funktion für den Fall, dass der Pool leer ist.
2
buf := bufPool.Get().(*bytes.Buffer)
Ruft einen verfügbaren Puffer aus dem Pool ab und führt eine Typzusicherung zu einem bytes.Buffer-Zeiger durch.
3
bufPool.Put(buf)
Setzt den Inhalt des Puffers zurück und gibt ihn zur Wiederverwendung an den Pool zurück.