goark/errs パッケージ v1.3.2 をリリースした
この前書いた記事で,最後の方に「そうそう errors
.Join
互換の関数ってあったほうがいいのかなぁ」と漠然と書いたのだが,その後,複数の goroutine を跨いでエラーハンドリングを行う必要ができたので, concurrency-safe なマルチエラー型 errs
.Errors
を作ってリリースした。
いやぁ,並行処理書くの久しぶりで,色々とバグを潰してたら v1.3.2 まで上がってしまった(笑)
たとえば,こんな感じに使える。
package main
import (
"fmt"
"sync"
"github.com/goark/errs"
)
func generateMultiError() error {
errlist := &errs.Errors{}
var wg sync.WaitGroup
for i := 1; i <= 2; i++ {
i := i
wg.Add(1)
go func() {
defer wg.Done()
errlist.Add(fmt.Errorf("error %d", i))
}()
}
wg.Wait()
return errlist.ErrorOrNil()
}
func main() {
err := generateMultiError()
fmt.Printf("%+v\n", err) // {"Type":"*errs.Errors","Errs":[{"Type":"*errors.errorString","Msg":"error 2"},{"Type":"*errors.errorString","Msg":"error 1"}]}
}
また errors
.Join()
互換の関数も用意してみた。
こんな感じ。
package main
import (
"errors"
"fmt"
"io"
"os"
"github.com/goark/errs"
)
func generateMultiError() error {
return errs.Join(os.ErrInvalid, io.EOF)
}
func main() {
err := generateMultiError()
fmt.Printf("%+v\n", err) // {"Type":"*errs.Errors","Errs":[{"Type":"*errors.errorString","Msg":"invalid argument"},{"Type":"*errors.errorString","Msg":"EOF"}]}
fmt.Println(errors.Is(err, io.EOF)) // true
}
今回新たに作った errs
.Errors
型は Unwrap() []error
メソッドを持っているため, Go 1.20 以降であれば errors
.Is()
および errors
.As()
関数を使って評価することができる。
これで errors
標準パッケージと互換性ありと言えるようになったかな?
ブックマーク
-
Go のエラーハンドリング : Zenn 本書きました
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- Go言語による並行処理
- Katherine Cox-Buday (著), 山口 能迪 (翻訳)
- オライリージャパン 2018-10-26
- 単行本(ソフトカバー)
- 4873118468 (ASIN), 9784873118468 (EAN), 4873118468 (ISBN)
- 評価