Go言語でスライスや制御構文を活用しながら、ユーザーからの入力をもとに平均値を計算する簡易アプリを作成してみましょう。本記事では、コードの解説を交えながら実践的なプログラムを段階的に構築します。
背景
スライスはGo言語における柔軟なデータ構造であり、配列と異なりサイズを動的に変更できます。また、Go言語の制御文や文字列操作を理解すれば、簡単なアプリケーションをすぐに構築できます。本記事では、次のような要件を満たすアプリを構築します。
- ユーザーから数値を入力
- 入力された値をスライスに追加
- 現在のスライスの平均値を計算・表示
- 特定のコマンド(例:
e
)で終了
完成コード
以下が最終的なコードです。これをもとに、各部分の動作を詳細に解説します。
package main
import (
"fmt"
"strconv" // 文字列を数値に変換するためのパッケージ
)
func main() {
var x []int
fmt.Println("値を追加してください。終わるときは 'e' を入力してください。")
for {
var input string
fmt.Scan(&input)
// 入力が 'e' の場合に終了
if input == "e" {
fmt.Println("終了します。")
break
}
// 入力を整数に変換
n, err := strconv.Atoi(input)
if err != nil {
fmt.Println("数値を入力するか、終了する場合は 'e' を入力してください。")
continue
}
// スライスに値を追加
x = append(x, n)
fmt.Println("現在の値:", x)
// 合計と平均を計算
sum := 0
for _, value := range x {
sum += value
}
average := float64(sum) / float64(len(x)) // 平均を小数点で計算
fmt.Printf("現在の平均: %.2f\n", average)
}
}
コード解説
1. スライスの初期化
var x []int
スライス x
を初期化しています。このスライスは動的に要素を追加するために使用します。Goのスライスは初期化時にサイズを指定する必要がなく、append
関数で動的に拡張できます。
2. ユーザー入力の受け取り
var input string
fmt.Scan(&input)
fmt.Scan
を使用して標準入力からデータを受け取ります。この例では、文字列として受け取るために input
を string
型で宣言しています。
3. 終了コマンドの処理
if input == "e" {
fmt.Println("終了します。")
break
}
ユーザーが終了コマンド(e
)を入力した場合にループを終了します。この条件は最初にチェックされるため、プログラムが不要な処理を続けることはありません。
4. 入力の数値変換
n, err := strconv.Atoi(input)
if err != nil {
fmt.Println("数値を入力するか、終了する場合は 'e' を入力してください。")
continue
}
ここでは、文字列を整数に変換しています。strconv.Atoi
は、文字列を整数に変換する標準ライブラリの関数です。変換に失敗した場合(例: abc
を入力)はエラーメッセージを表示し、次の入力を求めます。
5. スライスへの値の追加
x = append(x, n)
スライス x
に新しい値を追加します。append
関数を使用すると、既存のスライスに新しい要素を動的に追加できます。
6. 合計と平均の計算
sum := 0
for _, value := range x {
sum += value
}
average := float64(sum) / float64(len(x))
fmt.Printf("現在の平均: %.2f\n", average)
スライス内のすべての値を合計し、その合計をスライスの要素数で割ることで平均を計算しています。float64
型に型変換することで、小数点以下の値も正確に計算できます。
実行例
以下のように実行できます。
入力例
10
20
30
e
出力例
値を追加してください。終わるときは 'e' を入力してください。
現在の値: [10]
現在の平均: 10.00
現在の値: [10 20]
現在の平均: 15.00
現在の値: [10 20 30]
現在の平均: 20.00
終了します。
まとめ
このアプリケーションを通じて、以下のポイントを学ぶことができます。
- スライスを使用した動的なデータの格納方法
- ユーザー入力の処理とエラー対応
- 簡単なループと条件分岐の活用
さらに、Go言語の基本的な構文を理解することで、より複雑なアプリケーションの構築が可能になります。ぜひこのコードを基に、自分なりの機能追加や改良に挑戦してみてください!
コメントを残す