新しいものを表示

ラムダノートってこんな本も出してるんだねぇ。

>ピアリング戦記 ― 日本のインターネットを繋ぐ技術者たち – 技術書出版と販売のラムダノート
lambdanote.com/collections/fro

Spiegel@予備系 さんがブースト

次期Goの汎用for range。他力本願でほんのちょっとだけ試してみた - 標準愚痴出力 zetamatta.hatenablog.com/entry

@zetamatta コミック単行本も面白いです。巻末の書下ろしで不覚にもちょっとうるっとしましたw

Spiegel@予備系 さんがブースト

長文にチャレンジ。

拙文「Go のエラーハンドリング」でも書いたが
zenn.dev/spiegel/books/error-h

Go のエラーハンドリングの戦術は以下の4つに分類できる。

1. nil との比較(エラーの有無を評価)
2. インスタンスの同一性
3. タイプ・アサーションによってエラーの内部構造を取得する
4. エラーメッセージ(Error() メソッドの返り値)を解析する

このうち3番目と4番目の難易度が高いのは直感的に分かるだろう。
3番目はその型の内部構造を知っている必要があるし4番目はあからさまにバッドノウハウ(今どきで言うならアンチパターン)である。
なので,エラーを吐く場合にはできるだけ1番目または2番目のパターンに落とし込めるようにするのがよい。

もうひとつ。
Go では,エラーは Error 型に boxing される。スマートポインタと言ったほうが分かりやすい人もいるかも知れない。
そのため,エラー同士の比較では等価性(equality)ではなく(インスタンスオブジェクトの)同一性の評価となる(実質的にポインタ値の比較なので)。
ここで errors.New() 関数の価値が出てくるわけだ。
この関数を使ってあらかじめ sentinel error を作成しておくことで最初に挙げた4つの戦術のうち「インスタンスの同一性」がやりやすくなる。

さらに Go 1.13 からはエラーを構造化できるようになり errors.Is() 関数でエラーの原因を遡って「インスタンスの同一性」評価ができるようになった。
これにより errors.New() 関数の役割は sentinel error の生成に特化できるようになった。
これが go-err113 の意味である。

とはいえ Go 1.13 以前のコードでは errors.New() 関数にそこまでの意味はない。
特に fmt.Errof() 関数と比較すれば errors.New() 関数は圧倒的にコストが低い。
エラーの有無を評価を評価するだけでいいなら,関数の return のタイミングで errors.New() でエラーを生成しても全然 OK なわけだ。
古いコードではそういう戦術をとっている場合も多いだろう。

コンパイルエラーはともかく lint のルールは絶対ではない。
あるコードに対して lint をかける場合に「そのルールは本当に必要か?」検討するべきだ。
その上で「errors.New() 関数の役割は sentinel error の生成に特化」ことをプロジェクトのルールとするなら lint で積極的に評価スべきだし,そうでないならいっそルールから外すことも検討したほうがいいだろう。

...ここまでで1,100文字とちょっとか。全然余裕だなw 5,000文字とかショートショートが書けるぜwww

Spiegel@予備系 さんがブースト

> KotlinのコードからWebAssemblyバイナリを生成可能、Kotlin/Wasmがアルファ版として提供開始
publickey1.jp/blog/23/kotlinwe

Spiegel@予備系 さんがブースト

>都市を六角形タイル状にすれば事故へるのでは?→つくば市の一部で採用され、全ての人の方向感覚を破壊している - Togetter
togetter.com/li/2272671

あれだな。城下町のつくりと同じ。態と感覚を狂わせて敵の侵入を阻んでいるわけだw 特に三叉路は感覚狂うよねぇ

古いものを表示
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。