-
Notifications
You must be signed in to change notification settings - Fork 0
/
error_join_errorsas.go
102 lines (80 loc) · 1.92 KB
/
error_join_errorsas.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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package errs
import (
"errors"
"fmt"
"time"
"github.com/devlights/gomy/output"
)
type MyError1 struct {
Message string
Code int
}
type MyError2 struct {
Message string
Code int
}
type MyError3 struct {
Message string
Code int
}
func (me MyError1) Error() string {
return fmt.Sprintf("%d:%s", me.Code, me.Message)
}
func (me MyError2) Error() string {
return fmt.Sprintf("%d:%s", me.Code, me.Message)
}
func (me MyError3) Error() string {
return fmt.Sprintf("%d:%s", me.Code, me.Message)
}
// ErrorJoinErrorsAs は、Go1.20から追加された errors.Join() と errors.As() の関係性についてのサンプルです.
func ErrorJoinErrorsAs() error {
var (
errCh = make(chan error, 1)
)
defer close(errCh)
go func(errCh chan<- error) {
time.Sleep(100 * time.Millisecond)
e1 := &MyError1{
Message: "MyError1",
Code: 1,
}
e2 := &MyError2{
Message: "MyError2",
Code: 2,
}
errCh <- errors.Join(e1, e2)
}(errCh)
select {
case <-time.After(1 * time.Second):
case err, ok := <-errCh:
if ok {
var e1 *MyError1
var e2 *MyError2
var e3 *MyError3
output.Stdoutl("[err ]", err)
output.Stdoutl("[MyError1?]", errors.As(err, &e1))
output.Stdoutl("[MyError2?]", errors.As(err, &e2))
output.Stdoutl("[MyError3?]", errors.As(err, &e3))
output.Stdoutl("[e1]", *e1)
output.Stdoutl("[e2]", *e2)
output.Stdoutl("[e3]", e3) // e3はnilポインタとなっているのでデリファレンスするとpanicする
}
}
return nil
/*
$ task
task: [build] go build .
task: [run] ./try-golang -onetime
ENTER EXAMPLE NAME: error_join_errors_as
[Name] "error_join_errors_as"
[err ] 1:MyError1
2:MyError2
[MyError1?] true
[MyError2?] true
[MyError3?] false
[e1] 1:MyError1
[e2] 2:MyError2
[e3] <nil>
[Elapsed] 100.478853ms
*/
}