いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

Goメモ-14 (ループ, For, Tour of Go)

概要

Tour of Go の - For についてのサンプル。

tour.golang.org

Goのループは、すごくシンプルになっていて for ループしか存在しません。

while は無しです。foreachなループもforで書きます。

他の言語と同じ感じの for ループは

for i := 0; i < len(arr); i++ {
    xxxx
}

みたいな感じです。

foreach ループは

for i, v := range arr {
    xxx
}

という感じ。

while ループは

for count < limit {
    xxxx
}

という感じ。

無限ループは

for {
    xxxx
}

という感じ。

また、Goでは ゴルーチン (Goroutine) を利用する際に、forselect を組み合わせてよく利用します。

その場合、無限ループ内でチャネルの応答を待つという形を書くことが多いです。この場合、チャネルからデータが来たのでループを抜けようとすると breakラベル を使ったりします。

   // 無限ループ
    var (
        // 2秒後にタイムアウトするチャネル
        timeout = time.After(2 * time.Second)
    )

loop:
    for {
        select {
        case <-timeout:
            break loop
        }
    }

サンプル

package tutorial

import (
    "fmt"
    "time"
)

// ForLoop は、 Tour of Go - For (https://tour.golang.org/flowcontrol/1) の サンプルです。
func ForLoop() error {
    // ------------------------------------------------------------
    // Go言語の for は、 通常の for ループ と foreach ループ の両方を担う.
    // 書き方は、他の言語とほぼ同様. continue も break も同様.
    // Go言語には while が存在せず、 for のみで記載する.
    // ------------------------------------------------------------
    var (
        arr [10]int
    )

    // for ループ
    for i := 0; i < len(arr); i++ {
        arr[i] = i
    }

    fmt.Println(arr)

    // while ループ
    var (
        limit = 10
        count = 1
    )

    for count < limit {
        count++
    }

    fmt.Println(count, limit)

    // foreach ループ
    for i, v := range arr {
        fmt.Printf("[%d]:%v\t", i, v)
    }

    fmt.Println("")

    // 無限ループ
    var (
        // 2秒後にタイムアウトするチャネル
        timeout = time.After(2 * time.Second)
    )

loop:
    for {
        select {
        case <-timeout:
            break loop
        }
    }

    fmt.Println("break infinite loop")

    return nil
}

try-golang/tutorial_gotour_09_forloop.go at master · devlights/try-golang · GitHub

実行すると以下な感じ。

ENTER EXAMPLE NAME: gotour_for
[Name] "tutorial_gotour_forloop"
[0 1 2 3 4 5 6 7 8 9]
10 10
[0]:0   [1]:1   [2]:2   [3]:3   [4]:4   [5]:5   [6]:6   [7]:7   [8]:8   [9]:9   
break infinite loop

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com