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 mainimport ("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.