Nil Mapの判定
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 28/68。
Goにおいて、マップはnilと呼ばれる特別な状態を持つことができます。nilマップは、本質的にはメモリ内の何も指していない、初期化されていないマップです。この概念を理解することは非常に重要です。なぜなら、nilマップにキーを追加しようとすると、プログラムがパニックを起こしてクラッシュするためです。
nil マップがどのように発生し、どのような状態になるかを以下に示します:
var myMap map[string]int
// この時点でmyMapはnilですマップ変数を初期化せずに宣言すると、Goは自動的にそれをnilに設定します。nilのマップから読み取ることは安全ですが(ゼロ値を返します)、そこに書き込もうとするとパニックが発生します:
// これは安全です - 0を返します
value := myMap["key"]
// これはパニックになります!
myMap["key"] = 42この問題を回避するには、マップにキーを追加しようとする前に、マップが nil かどうかを常に確認する必要があります。チェックは簡単です:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // これで安全ですこの簡単なチェックを行うことで、初期化されていない可能性があるマップを操作する際にプログラムがクラッシュするのを防ぎ、コードの堅牢性と信頼性を高めることができます。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単書き込み操作を試みる前に nil マップをチェックすることで、パニックエラーを防ぐ安全なマップ初期化システムを作成してください。このチャレンジでは、プログラムをクラッシュさせる可能性のある操作を実行する前に、マップの状態を検証することの重要性を学びます。
2つの入力を受け取ります:
- 操作の数を示す文字列(例:
"5") - 次の形式の操作を含む文字列:
"operation1:key1:value1,operation2:key2:value2"。操作は"check"、"init"、または"add"のいずれかです(例:"check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")
あなたのタスクは以下の通りです:
map[string]int型の 2 つのマップ変数scoresとgradesを初期化せずに作成します(これらは nil になります)。- 入力文字列の各操作を順番に処理します:
"check"操作の場合:- 指定されたマップが nil かどうかを確認します。
- マップが nil の場合は
"Map [map_name] is nil"と出力します。 - マップが nil でない場合は
"Map [map_name] is initialized"と出力します。
"init"操作の場合:make(map[string]int)を使用して指定されたマップを初期化します。"Initialized map [map_name]"と出力します。
"add"操作の場合:- まず、マップが nil かどうかを確認します。
- マップが nil の場合は
"Cannot add to nil map [map_name]"と出力します。 - マップが nil でない場合は、キーと値のペアを追加し、
"Added [key]:[value] to [map_name]"と出力します。
- 入力文字列を分割して操作を解析します:
- カンマで分割して個々の操作を取得します。
- 各操作について、コロンで分割して操作タイプとパラメータを取得します。
- add 操作のために、値の文字列を整数に変換します。
- すべての操作を処理した後、両方のマップの最終状態を表示します:
- 各マップについて、nil の場合は
"Final state - [map_name]: nil"と出力します。 - 各マップについて、初期化されている場合は
"Final state - [map_name]: [count] entries"と出力します(count はキーと値のペアの数です)。
- 各マップについて、nil の場合は
add 操作で値の文字列を整数に変換するには strconv パッケージを使用してください。このチャレンジは、書き込み操作の前に nil マップをチェックすることで、ランタイムパニックを防ぎ、コードを堅牢で信頼性の高いものにする方法を示しています。
チートシート
nil マップは、メモリ内の何も指していない未初期化のマップです。nil マップにキーを追加しようとすると、プログラムがパニックを起こしてクラッシュします。
初期化せずにマップを宣言すると、nil マップが作成されます:
var myMap map[string]int
// この時点で myMap は nil ですnil マップからの読み取りは安全ですが(ゼロ値を返します)、書き込みを行うとパニックが発生します:
// これは安全です - 0 を返します
value := myMap["key"]
// これはパニックになります!
myMap["key"] = 42キーを追加する前に、マップが nil かどうかを必ず確認してください:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // これで安全になりました自分で試してみよう
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 入力を読み込む
var numOpsStr string
var operationsStr string
fmt.Scanln(&numOpsStr)
fmt.Scanln(&operationsStr)
// 初期化せずにマップを宣言(これらはnilになります)
var scores map[string]int
var grades map[string]int
// 操作をカンマで分割する
operations := strings.Split(operationsStr, ",")
// TODO: 以下にコードを記述してください
// 各操作を順番に処理します
// "check"、"init"、"add" の操作を処理してください
// add操作では、strconv.Atoi() を使用して値の文字列を整数に変換してください
// 両方のマップの最終状態を出力する
// マップがnilか初期化済みかを確認し、それに応じて出力してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。