The Go Programming Language Specification - The Go Programming Languageを眺めていたら、Go言語には色んな文法があるんだなぁ、と気付いたのでメモがてらに書いておきます。
goto文
スパゲティメーカーとして名高いgoto文ですが、ひっそりとGo言語にも存在するようです。
使い方はよくある普通のgotoと同じく、
package main
import "fmt"
func main() {
s := 0
i := 1
LOOP:
if i > 100 {
goto BREAK
}
s += i
i += 1
goto LOOP
BREAK:
fmt.Println(s)
}
みたいな感じです。1から100までの数字を足すだけのコードなんですけど既にgotoに慣れてない人には辛いコードになっているような気がします。
ちなみに、goto文を使ってif文やfor文の中へ潜り込むとかいう危険なことは出来ないみたいです。観念してください。
(ふと思い出しましたが、PHPかLuaにもgoto文ありましたね……)
使いどころは分かりません。goyaccが吐くコードでは使われてましたけど…。
どなたか教えて下さい。
fallthrough文
この単語を見てピンとくる人はどんな構文だか分かるだろうし、ピンとこない人には分からないであろう構文。
JavaScriptとかC言語なんかだと、switch文というのは、こんな風に明示的にbreak
してやらないといけない。
switch (x) {
case 1:
//do somethig if x is equal to 1
break;
case 2:
//do something if x is equal to 2
break;
case 3:
//do something if x is equal to 3
break;
default:
//otherwise
}
それに対して、Go言語のswitch文は自動的にbreak
するようになっている。
……んだけど、時々ごくまれにbreak
しないで次のcase
に進んで欲しいときがあります。
そんなときに、fallthrough
を使うことができます。
具体的には……どういうときなんでしょうね? 実際にfallthrough
を使う例が上手く浮かんでこないので、適当に作為的なサンプルを載せておきます。
package main
import "fmt"
func main() {
var x int
fmt.Scanf("%d", &x)
switch x {
case 1, 2, 3, 4:
fmt.Println("1, 2, 3, 4")
fallthrough
case 5, 6, 7, 8:
fmt.Println("5, 6, 7, 8")
fallthrough
default:
fmt.Println("default")
}
}
数値を受けとって、その値に応じてswitch文で分岐するだけの単純なプログラムです。
ただ、case 1, 2, 3, 4:
とcase 5, 6, 7, 8:
の部分にはfallthrough
があるので、そのcase
にマッチした場合、その下のcase
も実行されることになります。
ちなみにfallthrough文‘case‘の最後の文としてしか記述することができず(if文の中などもダメ!)、最後のcase
にfallthrough
があると(意味ないから)エラーになるので注意してください。
まとめ?
goto文もfallthrough文も、覚えておけば使う日があるかもしれませんが、知らなかったら知らなかったでどうにかなるような気もします。
……要するに、この記事には一体どんな意味があったのやら。