「Go/条件分岐と繰り返し」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎イテレート - for文: 素朴なFor文を説明用にIf文とGoto文の組み合わせで表現
タグ: 2017年版ソースエディター
73 行
=== イテレート - for文 ===
Goでは、For文がイテレート(繰返し;反復)する唯一の構文です(Goには、doやwhileはありません)。
For文には素朴なFor文と他の言語で言うForeach文の2種類の使い方があります。
{{See also|Go/文#For文}}
 
;素朴な[[W:For文|For文]]: <syntaxhighlight lang="go">for i := 0; i < n; i++ {
CやC++などのように
# /* 繰返す処理 */
: <syntaxhighlight lang="go">for i := 0; i < n; i++ {
// 繰返す処理
}
</syntaxhighlight>
: C言語のFor文に相当する機能です
 
;[[W:Foreach文|Foreach文]]的なFor文: <syntaxhighlight lang="go">
と書く方法と、C++の範囲For文やPythonのenumerate関数を伴ったFor文のように
 
: <syntaxhighlight lang="go">
for i, e := range collection {
//* 繰返す処理 */
}
</syntaxhighlight>
と書く方法と、: C++の範囲For文やPythonのenumerate関数を伴ったFor文のようにコレクションに作用します
という、: スライスや配列、mapなどのコレクションから一つずつ要素を取り出していく方法があります。
 
==== 素朴なFor文 ====
という、スライスや配列、mapなどのコレクションから一つずつ要素を取り出していく方法があります。
まず、前者素朴For文の使い方を説明します。
 
: <syntaxhighlight lang="go">
まず、前者の方の使い方を説明します。
 
<syntaxhighlight lang="go">
for 初期化; 条件式; ポスト文 {
/ /* 繰返す処理 */
}
</syntaxhighlight>
 
これをIf文とGoto文を使って書き直すと。
''初期化''および''ポスト文''は単純な文(簡単な変数宣言、インクリメント文、代入、関数呼び出し)でなくてはならない。また、条件式は論理式 (trueかfalseを返す式)でなくてはならない。For文は次のように実行される。
 
: <syntaxhighlight lang="go">
# 初期化
{
# 繰返す処理
# 初期化
# ポスト文
top:
# 条件式が true ならばもう一度 2.に戻る。偽ならFor文を終了する。
if !(条件式) {
 
goto bottom
また、C言語などと同様にGoでも、Break文やReturn文などがforブロック中({ } の内部)にあれば、すべての要素をイテレートする前にFor文から脱出します。
}
/ /* 繰返す処理 */
# ポスト文
goto top
bottom:
}
</syntaxhighlight>
: (上記のコードはFor文の働きをうまく書き表せていますが、Break文とContinue文があった場合の挙動はFor文とは異なります)
: ''初期化''および''ポスト文''は単純な文(簡単な変数宣言、インクリメント文、代入、関数呼び出し)でなくてはならない。た、条件式は論理式 (trueかfalseを返す式)でなくてはならない。For文は次のように実行されるせん
: また、条件式は論理式 (trueかfalseを返す式)でなくてはならず、省略されると true が仮定されます。
: while はこの形式の最初と最後の文を省略した
::<syntaxhighlight lang="go">for 条件式 {
/* 繰返す処理 */
}
</syntaxhighlight>と表現します。
 
;[https://play.golang.org/p/5YquULYfrQ6 コード例]:<syntaxhighlight lang="go">
133 ⟶ 146行目:
 
==== range 節を伴った For文 ====
Goにも[[W:Foreach文|Foreach文]]的なFor文があり、For文のrange節を伴った場合、構文を使用します。
スライス・配列・文字列・マップ・チェンネルなどのコレクションの要素を1つづつ(breakやreturnで中途退出しない限り)すべてイテレートします。
{{See also|Go/文#range_節のある文の場合}}
 
310 ⟶ 324行目:
</syntaxhighlight>
: For・rangeにチェンネルを適用するとクローズされるまで受信した値をイテレートします。
 
====For文からの脱出====
また、C言語などと同様にGoでも、Break文やReturn文などがforブロック中({ } の内部)にあれば、すべての要素をイテレートする前にFor文から脱出します。
{{See also|Go/文#Break文|Go/文#Continue文|Go/文#Return文}}