【Go言語】スコープ…エイm? な If - その2

【Go言語】スコープ…エイm? な If - その2 - サムネイル IT

え~、Go です。

前回の続きです。

というわけで、If の使い方その2ってことで進めていきます。

- PR -

今回のお題は「If with a short statement」と「If and else」

なんとなく訳してみると、「If と 短いステートメント(手続き)」、それと「If とelse」といった感じでしょうかね?

前回進めた If から、もう少し踏み込んだ内容が書かれているようです。

そして今回の進めるページのURLはこちらね。(´・ω・)つhttps://go-tour-jp.appspot.com/flowcontrol/6

A Tour of Go - If with a short statement のページ
A Tour of Go – If with a short statement のページ

もういっこはこちら。(´・ω・)つhttps://go-tour-jp.appspot.com/flowcontrol/7

A Tour of Go - If and else のページ
A Tour of Go – If and else のページ

じゃ~中身を見ていきまーす。

内容を見ていく

今回は2ページ分まとめて進めますが、どちらもそれほど難しいことは書いてないようです。

ポイントを抜き出してみると…

  • If の条件式の前に簡単なステートメントが書ける
  • そのステートメントで宣言された変数は If のスコープ内で有効

ですね。

それでは順番に詳しく見ていきます。

If の条件の前に簡単なステートメントが書ける

前回やりましたが、If を書くときには<条件式> を書く必要があります。

Go言語では、この<条件式>の前に簡単なステートメントを追記できるようです。

ifとステートメント
ifとステートメント

実際にプログラムで書いてみると…

Go
package main

import (
	"fmt"
)

func main() {

	// ① if でステートメントを一緒に書く
	if fmt.Println("①Ifのステートメントですよ~") ; true {
	
		// <条件式>の部分が true なので中に入る
		fmt.Println("①Ifの中ですよ~")
	}
	
	// ②こんどは条件を false にする
	if fmt.Println("②Ifのステートメントですよ~") ; false {
	
		// <条件式>の部分が false なので中には入らない
		fmt.Println("②Ifの中ですよ~")
	}
	
}
Expand

Go Playground

と、こんな感じになります。

そして Run してみると気づくと思いますが、If に書いたステートメントは <条件式> の真偽に関わらず実行されるようですね。

そのステートメントで宣言された変数は If のスコープ内で有効

続いて If のステートメント部分で変数を宣言したときのお話ですね。

結論から言っちゃえば、ステートメント部分で宣言された変数は If のスコープ内(中括弧内)のみで有効なようです。

ifとステートメントと変数
ifとステートメントと変数

実際に試してみます。

まずは If のスコープ内で変数を使ってみます。

Go
package main

import (
	"fmt"
)

func main() {

	// ① Ifのステートメントで変数を宣言する
	if v := "①変数が使えるかな~?" ; true {
	
		// 変数 v を出力する
		fmt.Println(v)
	}
	
	// ② 今度は else 側で試してみる
	if v := "②変数が使えるかな~?" ; false {
		// 何もしない
	} else {

		// 変数 v を出力する
		fmt.Println(v)
	}
	
}
Expand

Go Playground

else の方も含めて変数を使うことができました。

さて、今度は if のスコープ外で使ってみます。

Go
package main

import (
	"fmt"
)

func main() {

	// ① Ifのステートメントで変数を宣言する
	if v := "①変数が使えるかな~?" ; true {
		// 何もしない	
	}
	
	fmt.Println(v)
	
}
Expand

Go Playground

Run するとわかりますがエラーが表示されます。

prog.go:14:14: undefined: v

これは、変数 v が undefined(未定義)です、って言われています。

というわけで、if のスコープ外では使えませんでした。

サンプルプログラムについて

ここまでに使ったことのないファンクションなどがあり、ポイントがブレそうなので触れないことにします。

とは言いつつも、完全にスルーするのもアレなので、、、コメントを差し込んだものくらいは載せておきます。

If with a short statement のサンプルプログラム
Go
package main

import (
	"fmt"   // 標準的なI/Oをまとめたパッケージ
	"math"  // 数学的な関数をまとめたパッケージ
)

// x(値1), y(値2), lim(リミット)が引数
// x を y の数だけ累乗した結果が、
// lim より小さければ 計算結果を返す
// lim と同じかそれ以上なら lim を返す
func pow(x, n, lim float64) float64 {

	// math.Pow ← これは累乗計算用のファンクション
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}

func main() {

	fmt.Println(
		pow(3, 2, 10), // 3 * 3 = 9 → 結果が lim より小さいので 9 となる
		pow(3, 3, 20), // 3 * 3 * 3 = 27 → 結果が lim より大きいので lim (20) となる
	)
}
Expand

Go Playground

If and else のサンプルプログラム
Go
package main

import (
	"fmt"   // 標準的なi?Oをまとめたパッケージ
	"math"  // 数学的な関数をまとめたパッケージ
)

// x(値1), y(値2), lim(リミット)が引数
// x を y の数だけ累乗した結果が、
// lim より小さければ計算結果を返す
// lim と同じかそれ以上なら比較結果を出力し lim を返す
func pow(x, n, lim float64) float64 {

	if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	// can't use v here, though
	return lim
}

func main() {
	fmt.Println(
		pow(3, 2, 10), // 3 * 3 = 9 → 結果が lim より小さいので 9 が出力される
		pow(3, 3, 20), // 3 * 3 * 3 = 27 → 結果が lim より大きいので 比較結果 が出力され lim (20) が出力される
	)
}
Expand

Go Playground

今回のまとめ

前回に引き続いての If。

今回やったことをまとめてみますと…

  • ステートメントを一緒に書く場合は、if <ステートメント> : <条件式> { … }、と書くんです
  • Ifのステートメントで定義された変数は、If のスコープでしか使えないんです

こんなところでしょうか。

If については今回で終わりなようで、次回は…実習?的な内容みたいです。

というわけで今回はここまで。

それじゃまた次回~。٩(๑´3`๑)۶

コメント

タイトルとURLをコピーしました