go / expert
Snippet
Hierarchische Inspektionsprüfung von Multi-Fehler-Bäumen über benutzerdefinierte Unwrap-Slices
Go 1.20 führte die Unterstützung für das Entpacken mehrerer Fehler durch eine `Unwrap() []error`-Methode auf benutzerdefinierten Fehlertypen ein. Dadurch können Standardfunktionen wie `errors.Is` und `errors.As` baumartige Fehlerstrukturen über mehrere Pfade hinweg rekursiv durchsuchen.
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
package mainimport ("errors""fmt""io")type MultiError struct {Errors []error}func (m *MultiError) Error() string {return fmt.Sprintf("encountered %d combined errors", len(m.Errors))}func (m *MultiError) Unwrap() []error {return m.Errors}func main() {err1 := fmt.Errorf("read failure: %w", io.EOF)err2 := errors.New("connection reset")joined := &MultiError{Errors: []error{err1, err2}}if errors.Is(joined, io.EOF) {fmt.Println("Matched io.EOF deep within MultiError slice!")}}
Erklärung
1
func (m *MultiError) Unwrap() []error {
Implementiert die Go 1.20+ Multi-Fehler-Unwrap-Schnittstelle, wodurch errors.Is und errors.As mehrere Fehlerpfade durchlaufen können.
2
err1 := fmt.Errorf("read failure: %w", io.EOF)
Ummantelt einen Standard-Sentinel-Fehler mit dem %w-Verb, um die zugrunde liegende Fehlerursache beizubehalten.
3
if errors.Is(joined, io.EOF) {
Durchsucht rekursiv das durch Unwrap() zurückgegebene Fehler-Slice nach übereinstimmenden Ziel-Fehlertypen.