Skip to content

Commit becee1a

Browse files
authored
Merge pull request #652 from devlights:add-errors-as-go120-example
Add error_join_errorsas.go
2 parents ce915e2 + 067be93 commit becee1a

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package errs
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"time"
7+
8+
"github.com/devlights/gomy/output"
9+
)
10+
11+
type MyError1 struct {
12+
Message string
13+
Code int
14+
}
15+
16+
type MyError2 struct {
17+
Message string
18+
Code int
19+
}
20+
21+
type MyError3 struct {
22+
Message string
23+
Code int
24+
}
25+
26+
func (me MyError1) Error() string {
27+
return fmt.Sprintf("%d:%s", me.Code, me.Message)
28+
}
29+
30+
func (me MyError2) Error() string {
31+
return fmt.Sprintf("%d:%s", me.Code, me.Message)
32+
}
33+
34+
func (me MyError3) Error() string {
35+
return fmt.Sprintf("%d:%s", me.Code, me.Message)
36+
}
37+
38+
// ErrorJoinErrorsAs は、Go1.20から追加された errors.Join() と errors.As() の関係性についてのサンプルです.
39+
func ErrorJoinErrorsAs() error {
40+
var (
41+
errCh = make(chan error, 1)
42+
)
43+
defer close(errCh)
44+
45+
go func(errCh chan<- error) {
46+
time.Sleep(100 * time.Millisecond)
47+
48+
e1 := &MyError1{
49+
Message: "MyError1",
50+
Code: 1,
51+
}
52+
e2 := &MyError2{
53+
Message: "MyError2",
54+
Code: 2,
55+
}
56+
57+
errCh <- errors.Join(e1, e2)
58+
}(errCh)
59+
60+
select {
61+
case <-time.After(1 * time.Second):
62+
case err, ok := <-errCh:
63+
if ok {
64+
var e1 *MyError1
65+
var e2 *MyError2
66+
var e3 *MyError3
67+
68+
output.Stdoutl("[err ]", err)
69+
output.Stdoutl("[MyError1?]", errors.As(err, &e1))
70+
output.Stdoutl("[MyError2?]", errors.As(err, &e2))
71+
output.Stdoutl("[MyError3?]", errors.As(err, &e3))
72+
73+
output.Stdoutl("[e1]", *e1)
74+
output.Stdoutl("[e2]", *e2)
75+
output.Stdoutl("[e3]", e3) // e3はnilポインタとなっているのでデリファレンスするとpanicする
76+
}
77+
}
78+
79+
return nil
80+
}

examples/basic/errs/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2020
m["error_is_and_as"] = IsAndAs
2121
m["error_join"] = ErrorJoin
2222
m["error_join_fmt_errorf"] = ErrorJoinFmtErrorf
23+
m["error_join_errors_as"] = ErrorJoinErrorsAs
2324
}

0 commit comments

Comments
 (0)