2020/04/17

[golang]ifの1行で実行とエラー判定をしたい

golangのコードを見ていると、ifで実行しつつエラーの判定をしていることがある。

When Should I Use One Liner if...else Statements in Go? - Calhoun.io
https://www.calhoun.io/one-liner-if-statements-with-errors/

ここの最初に出てくるようなやつね。

01: if err := doStuff(); err != nil {
02:   // handle the error here
03: }

見た目から入っていきたいお年頃。こういう書き方はgolangっぽいという気がするのでまねしたい。

 

16進数の文字列が渡されたら処理をして、そうじゃなかったら別の処理、みたいなことをやろうとしていた。
0xで始まる数字であれば16進数と見なそうかと思ったが、そんなに急ぐ処理でも無いのでデコードしてエラーがなければ、という判定までしよう。
20byteなので、0xまで入れたら42文字。

01: if (len(mojimoji) == 42) && (_, err := hex.DecodeString(mojimoji[2:]); err == nil) {
02:     ...
03: } else {
04:     ...
05: }

syntax error: unexpected comma, expecting )

えっ、ダメなの??

ifを2つに分けると、大丈夫。

01: if len(mojimoji) == 42 {
02:     if _, err := hex.DecodeString(mojimoji[2:]); err == nil {
03:         ...
04:     }
05: } else {
06:     ...
07: }

golang以外だったら分けて書くだろうし、やっぱりセミコロンを挟む書き方はちょっと違うのだろう。

 

言語仕様を探し出せなかったのだが、ifにセミコロンがあると、セミコロン前が処理相当になるらしい。
じゃあ、ダメか。

 

先にhex.DecodeString()してしまえば、セミコロンの後ろに条件文を&&で書いてしまえば良いかもしれん。
が、それは嫌だ!
文字長の処理の方が16進数文字列のデコードより処理が軽いのは間違いなかろう。だったら、先に軽い処理で露払いをして、その壁を乗り越えてから本番を迎えるのがよかろう。

 

「急ぐ処理じゃあない」と書いておきながら矛盾している気もするが、譲れない線もあるのだ。
意味があるかどうかは別としてね。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。