golang
switchやifの追加や変更がしやすい書き方について紹介します。
switchの共通処理
gotoを使うことで簡単に共通処理を書くことができます。
switch i{
case 0:
case 1:
case 2:
default:
goto skip
}
//ここに共通処理
skip:
こうします。
ifの場合は最後のelseにgotoを書いて同じようにします。
switch文では処理のないcaseを追加するだけで共通処理が実行されるので、ifよりも活用しやすいです。
実用例
switch e.Code{
case key.CodeUpArrow:
relY -= 0.1
case key.CodeDownArrow:
relY += 0.1
case key.CodeLeftArrow:
relX += 0.1
case key.CodeRightArrow:
relX -= 0.1
default:
goto none
}
//画面更新イベント送信
win.Send(size.Event{WidthPx:rc.width, HeightPx:rc.height})
none:
矢印キーを移動処理をした後に、必ず画面を更新します。
例えば、画面の拡大縮小などのイベントを新たに追加すると自動で更新処理も呼び出されます。
if/switchの特殊(変)な書き方
if true &&
true &&
false{
//処理
}
入れ子を解消して、インデントや行数を少なくできます。
また適切に改行を入れることで行が長くなりすぎるのを防ぎます。
改行だけで条件を追加できるのが魅力的です。
実用例
変更前
if nameF || direF{
if dFlag{
if namesub.check(v.Name()){
if diresub.checkContain(path){
if lineF{
fmt.Println(pathFormat(v, path) + "\n")
}else{
fmt.Println("not found")
}
}
}
}
}
変更後
if nameF || direF &&
dFlag &&
namesub.check(v.Name()) &&
diresub.checkContain(path){
lineF{
fmt.Println(pathFormat(v, path) + "\n")
}else{
fmt.Println("not found")
}
}
switch版
switch{
case
nameF || direF &&
dFlag &&
namesub.check(v.Name()) &&
diresub.checkContain(path):
if lineF{
fmt.Println(pathFormat(v, path) + "\n")
}else{
fmt.Println("not found")
}
}
switch否定版(処理内容は同じ)
switch false{
case
nameF || direF,
dFlag,
namesub.check(v.Name()),
diresub.checkContain(path):
default:
if lineF{
fmt.Println(pathFormat(v, path) + "\n")
}else{
fmt.Println("not found")
}
}
インデントはgofmt準拠ですが、ちょっと違和感がある箇所もありますね。switchは、否定版の,(カンマ)区切りの方が違和感のないインデントでした。
どちらもあくまで追加変更がしやすい特殊な書き方なので、読みやすさは度外視です。
むやみに使わないこと、他人に見せるコードには使わないこと、忘れないよう適切なコメントを入れること。