0 Tage Serie
go / intermediate
Snippet

Implementierung eines benutzerdefinierten Dekorierers mit io.Reader

Dieses Snippet demonstriert das Decorator-Muster unter Verwendung des standardmäßigen io.Reader-Interfaces von Go. Durch das Kapseln eines bestehenden io.Reader können wir Daten während des Lesevorgangs abfangen und transformieren, indem wir Kleinbuchstaben inline in Großbuchstaben umwandeln, ohne zusätzlichen Arbeitsspeicher zuzuweisen.

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
31
32
package main
import (
"fmt"
"io"
"strings"
)
type UpperReader struct {
reader io.Reader
}
func NewUpperReader(r io.Reader) *UpperReader {
return &UpperReader{reader: r}
}
func (ur *UpperReader) Read(p []byte) (int, error) {
n, err := ur.reader.Read(p)
for i := 0; i < n; i++ {
if p[i] >= 'a' && p[i] <= 'z' {
p[i] = p[i] - 32
}
}
return n, err
}
func main() {
r := NewUpperReader(strings.NewReader("hello reader"))
buf := make([]byte, 32)
n, _ := r.Read(buf)
fmt.Println(string(buf[:n]))
}
Erklärung
1
type UpperReader struct {
Deklariert ein Struct, das ein bestehendes io.Reader-Interface einbettet.
2
func (ur *UpperReader) Read(p []byte) (int, error) {
Implementiert die io.Reader-Interface-Methode, um Inhalte abzurufen und zu modifizieren.
3
p[i] = p[i] - 32
Konvertiert Kleinbuchstaben in ASCII direkt im übergebenen Puffer zu Großbuchstaben.