プロセス制御には、条件判定、ループ制御、無条件ジャンプの 3 つの主要なカテゴリがあります。
もし
if はおそらくさまざまなプログラミング言語の中で最も一般的であり、その構文は次のように要約できます: 条件が満たされた場合は何かを行い、そうでない場合は別のことを行います。
次のコードに示すように、Go の if 条件判定ステートメントには括弧は必要ありません。
if x > 10 {
fmt.Println("x is greater than 10")
} else {
fmt.Println("x is less than 10")
}
Go の if のもう 1 つの強力な点は、条件付き判断ステートメントで変数を宣言できることです。この変数のスコープは条件付きロジック ブロック内にのみ存在でき、以下に示すように、他の場所では機能しません。
// 计算获取值 x, 然后根据 x 返回的大小,判断是否大于 10 。
if x := computedValue(); x > 10 {
fmt.Println("x is greater than 10")
} else {
fmt.Println("x is less than 10")
}
// 这个地方如果这样调用就编译出错了,因为 x 是条件里面的变量
fmt.Println(x)
条件が複数ある場合は以下のようになります。
if integer == 3 {
fmt.Println("The integer is equal to 3")
} else if integer < 3 {
fmt.Println("The integer is less than 3")
} else {
fmt.Println("The integer is greater than 3")
}
後藤
Go には goto ステートメントがあります。これを賢く使用してください。goto を使用して、現在の関数内で定義する必要があるラベルにジャンプします。たとえば、次のようなループについて考えてみましょう。
func myFunc() {
i := 0
Here: // 这行的第一个词,以冒号结束作为标签
println(i)
i++
goto Here // 跳转到 Here 去
}
タグ名では大文字と小文字が区別されます。
のために
Go で最も強力な制御ロジックは for で、ループでデータを読み取ることができ、ロジックを制御する while として使用でき、反復操作も可能です。その構文は次のとおりです。
for expression1; expression2; expression3 {
//...
}
expression1、expression2、およびexpression3はすべて式です。expression1とexpression3は変数宣言または
関数呼び出しの戻り値で、expression2は条件判定に使用され、expression1はループの開始前に呼び出され、expression3は
各サイクルの終了時に呼び出されます。
上記よりも例の方が便利なので、次の例を見てみましょう。
package main
import "fmt"
func main(){
sum := 0;
for index:=0; index < 10 ; index++ {
sum += index
}
fmt.Println("sum is equal to ", sum)
}
// 输出: sum is equal to 45
場合によっては、複数の代入演算が必要になります。Go には演算がないため、並列代入 i、j = i+1、j-1 を使用できます。式 1 と式 3 を無視すると、次のようになります
。
sum := 1
for ; sum < 1000; {
sum += sum
}
このうち、;も省略できる場合は以下のコードになります。はい、これが while の動作です。
sum := 1
for sum < 1000 {
sum += sum
}
ループには、break と continue の 2 つの主要な操作があります。break 操作は現在のループから飛び出すことであり、Continue 操作はこのループをスキップすることです。ネスト
が深すぎる場合は、ラベルを使用してブレークを使用できます。つまり、ラベルで指定された位置にジャンプします。詳細については、次の例を参照してください。
for index := 10; index>0; index-- {
if index == 5{
break // 或者 continue
}
fmt.Println(index)
}
// break 打印出来 10 、 9 、 8 、 7 、 6
// continue 打印出来 10 、 9 、 8 、 7 、 6 、 4 、 3 、 2 、 1
また、break と continue の後にラベルを付けて、複数のループ内の外側のループにジャンプすることもできます。
for と range を組み合わせて使用すると、スライスとマップ データを読み取ることができます。
for k,v:=range map {
fmt.Println("map's key:",k)
fmt.Println("map's val:",v)
}
Go は「複数の値の戻り値」をサポートしているため、コンパイラは「宣言されているが呼び出されない」変数に対してエラーを報告します。この場合、_ を使用して不要な戻り値を破棄できます。たとえば
for _, v := range map{
fmt.Println("map's val:", v)
}
スイッチ
論理的な処理を実装するために、多くの if-else を記述する必要がある場合があります。現時点では、コードは見苦しくて長くなり、将来のメンテナンスが容易ではありません。現時点では、switch がこの問題をうまく解決できます。 。その構文は次のとおりです
switch sExpr {
case expr1:
some instructions
case expr2:
some other instructions
case expr3:
some other instructions
default:
other code
}
sExpr と expr1、expr2、expr3 の型は一貫している必要があります。Go のスイッチは非常に柔軟です。式は定数や整数である必要はありません。実行プロセスは一致するものが見つかるまで上から下に行われます。スイッチに式がない場合は true と一致します。
i := 10
switch i {
case 1:
fmt.Println("i is equal to 1")
case 2, 3, 4:
fmt.Println("i is equal to 2, 3 or 4")
case 10:
fmt.Println("i is equal to 10")
default:
fmt.Println("All I know is that i is an integer")
}
5 行目では、多くの値を 1 つのケースに集約しています。同時に、Go のスイッチは各ケースの終わりのブレークに相当します。一致が成功した後、他のケースは自動的に下方向に実行されませんが、スイッチ全体が飛び出てしまいますが、フォールスルーを使用して後続のケース コードを強制的に実行することができます。
integer := 6
switch integer {
case 4:
fmt.Println("The integer was <= 4")
fallthrough
case 5:
fmt.Println("The integer was <= 5")
fallthrough
case 6:
fmt.Println("The integer was <= 6")
fallthrough
case 7:
fmt.Println("The integer was <= 7")
fallthrough
case 8:
fmt.Println("The integer was <= 8")
fallthrough
default:
fmt.Println("default case")
}
// 上面的程序将输出
The integer was <= 6
The integer was <= 7
The integer was <= 8
default case