ホームページ >バックエンド開発 >Golang >Go 言語の基本 - ループ文

Go 言語の基本 - ループ文

Go语言进阶学习
Go语言进阶学习転載
2023-07-24 16:00:09639ブラウズ

#Go 言語には for ループ文のみがあり、他の言語 (C 言語など) にある while ループや do-while ループはありません。 、など)があります。

#for ループ構文
for initialisation; condition; post {  
}

initialisation 初期化ステートメントは次のとおりです。実行 一旦、初期化が完了した後、条件条件が真であるかどうかを確認し、真である場合は、{} 内のコードが実行され、その後、post ステートメントが実行されます。 {} 内のループ ステートメントが正常に反復されるたびに、post ステートメントが実行され、条件が true かどうかが再チェックされます。 true の場合、ループ ステートメントの実行は続行されます。そうでない場合、ループは終了します。

Go では、初期化、条件、ポストはすべてオプションです。 for ループをよりよく理解するために例を見てみましょう。

for ループを使用して 1 から 10 までのすべての整数を出力するプログラムを作成します。

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        fmt.Printf(" %d",i)
    }
}

実行

上記のコードでは、i は 1 に初期化されており、条件ステートメントは i 上記のコードは出力を出力します: 1 2 3 4 5 6 7 8 9 10

for ループで宣言された変数は、ループ本体のスコープ内でのみ使用できます。 。したがって、for ループ本体の外では変数 i にアクセスできません。

breakbreak は、for ループを終了し、ループから抜け出して、for ループに続くステートメントの実行を継続するために使用されます。

前のコードを変更し、break ステートメントを使用して 1 ~ 5 のすべての整数のみを出力します。

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i > 5 {
            break //loop is terminated if i > 5
        }
        fmt.Printf("%d ", i)
    }
    fmt.Printf("\nline after for loop")
}

Execution

上記のコードでは、i の値が反復ごとにチェックされます。 i が 5 より大きい場合、break が実行されてループが終了し、for ループ後の print ステートメントが実行されます。

上面的程序会输出:

1 2 3 4 5  
line after for loop

continue

continue 语句用于跳过 for 循环的当前迭代。本次迭代中,for 循环里面、continue 语句之后的代码都不会执行,继续进行下一次迭代。

让我们编写一个程序,使用 continue 打印从 1-10 的所有奇数。

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Printf("%d ", i)
    }
}

执行

在上面的代码行 if i%2 == 0,检查 i 除以 2 的余数是否为 0。如果为零,则该数为偶数,执行 continue 语句,则不会调用 continue 之后的 print 语句,并且循环继续进行下一次迭代。

上述程序的输出:1 3 5 7 9。

嵌套循环

一个 for 循环内部有另一个 for 循环称为嵌套 for 循环。

我们通过编写一个打印以下序列的程序来理解嵌套的 for 循环。

*
**
***
****
*****

下面的程序使用嵌套 for 循环打印上述序列。

第 8 行的变量 8 存储序列的行数,我们这里是 5。外部 for 循环将 i 从 0 迭代到 4,内部 for 循环将 j 从 0 迭代到 i 的当前值。内部循环为每次迭代打印 * ,外部循环在每次迭代结束时打印一个新行。

运行这个程序将会输出上面的有序序列。

package main

import (  
    "fmt"
)

func main() {  
    n := 5
    for i := 0; i < n; i++ {
        for j := 0; j <= i; j++ {
            fmt.Print("*")
        }
        fmt.Println()
    }
}

执行

标签

标签(label)可用于在内部 for 循环中断外部循环。让我们通过一个简单的例子来理解下:

package main

import (  
    "fmt"
)

func main() {  
    for i := 0; i < 3; i++ {
        for j := 1; j < 4; j++ {
            fmt.Printf("i = %d , j = %d\n", i, j)
        }

    }
}

执行

上面的程序比较容易理解,将会输出:

i = 0 , j = 1  
i = 0 , j = 2  
i = 0 , j = 3  
i = 1 , j = 1  
i = 1 , j = 2  
i = 1 , j = 3  
i = 2 , j = 1  
i = 2 , j = 2  
i = 2 , j = 3

上面的代码没什么特别的,我们继续往下看。

如果我们想实现当 i 和 j 相等时,停止打印该怎么办?我们需要做的是从内部循环破坏外部 for 循环。我们尝试在内部 for 循环判断当 i 和 j 相等时,执行 break 语句看能够实现中断外部 for 循环。

package main

import (  
    "fmt"
)

func main() {  
    for i := 0; i < 3; i++ {
        for j := 1; j < 4; j++ {
            fmt.Printf("i = %d , j = %d\n", i, j)
            if i == j {
                break
            }
        }

    }
}

执行

上面的代码,当判断 i 和 j 相等时,我们在内部 for 循环中会执行 break 语句,但这只会中断本次内部 for 循环,外部循环将继续执行。

程序输出:

i = 0 , j = 1  
i = 0 , j = 2  
i = 0 , j = 3  
i = 1 , j = 1  
i = 2 , j = 1  
i = 2 , j = 2

这显然不是我们预期的输出。当 i 和 j 都相等时,即它们都等于 1 时,我们需要停止打印。

这时候标签(label)就可以派上用场了。标签可用于中断外部循环,让我们用 label 重写上面的程序。

package main

import (  
    "fmt"
)

func main() {  
outer:  
    for i := 0; i < 3; i++ {
        for j := 1; j < 4; j++ {
            fmt.Printf("i = %d , j = %d\n", i, j)
            if i == j {
                break outer
            }
        }

    }
}

执行

在上面的代码,我们在第 8 行循环的外部添加了名为 outer 的标签,在第 13 行通过指定跳转到该标签来终止外部循环,当 i 和 j 相等时,程序将停止打印。

执行代码输出:

i = 0 , j = 1  
i = 0 , j = 2  
i = 0 , j = 3  
i = 1 , j = 1

更多示例

我们通过更多的示例学习下 for 语句的不用用法。

下面的代码打印从 0 到 10 的所有偶数。

package main

import (  
    "fmt"
)

func main() {  
    i := 0
    for ;i <= 10; { // initialisation and post are omitted
        fmt.Printf("%d ", i)
        i += 2
    }
}

执行

我们已经知道,for 语句中 initialisation、condition 和 post 都是可选的。上面代码中,initialisation 和 post 都被忽略了,在循环外部,变量 i 已经初始化为 0。只要 i <= 10,就会执行循环,在 for 循环内部 i 每次都增加 2.

上述代码的 for 循环语句的分号也可以省略。这种格式可以认为是 while 循环的替代方案。上面的代码可以重写为:

package main

import (  
    "fmt"
)

func main() {  
    i := 0
    for i <= 10 { //semicolons are ommitted and only condition is present
        fmt.Printf("%d ", i)
        i += 2
    }
}

执行

可以在 for 语句中声明和操作多个变量。让我们编写一个程序,使用多个变量声明打印以下序列。

10 * 1 = 10  
11 * 2 = 22  
12 * 3 = 36  
13 * 4 = 52  
14 * 5 = 70  
15 * 6 = 90  
16 * 7 = 112  
17 * 8 = 136  
18 * 9 = 162  
19 * 10 = 190
package main

import (  
    "fmt"
)

func main() {  
    for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 { //multiple initialisation and increment
        fmt.Printf("%d * %d = %d\n", no, i, no*i)
    }

}

执行

在上面的代码中,no 和 i 分别被声明和初始化为 10 和 1,每次迭代结束时都递增 1。在 condition 条件中使用布尔运算符 && 来确保 i 小于或等于 10 并且 no 小于或等于 19。

无限循环

无限循环的语法如下:

for {  
}

下面的代码将会循环不停地打印 Hello World。

package main

import "fmt"

func main() {  
    for {
        fmt.Println("Hello World")
    }
}

如果你在 go playground 中运行上面程序,将会报错:“process took too long”。在本地环境执行时将无限打印 Hello World。

以上がGo 言語の基本 - ループ文の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。