LoginSignup
6
5

More than 5 years have passed since last update.

Go言語の誰も知らないし知らなくていい文法2つ

Posted at

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文の中などもダメ!)、最後のcasefallthroughがあると(意味ないから)エラーになるので注意してください。

まとめ?

goto文もfallthrough文も、覚えておけば使う日があるかもしれませんが、知らなかったら知らなかったでどうにかなるような気もします。
……要するに、この記事には一体どんな意味があったのやら。

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5