mapの内部構造
mapがデータを格納する仕組みを理解します
「mapの内部構造」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
マップとは
マップはキーと値のペアを格納します。それぞれのキーは1つの値に対応し、平均的には非常に高速に検索できます。
Goではmap[KeyType]ValueTypeと記述します。
package main
import "fmt"
func main() {
ages := map[string]int{"Ann": 30, "Bob": 25}
fmt.Println(ages["Ann"])
}内部のハッシュテーブル
Goのマップはハッシュテーブルとして実装されています。ハッシュ関数は各キーを、値が格納されているバケットを指す数値に変換します。
バケット
マップはエントリをバケットに格納します。各バケットには複数のキーと値のペアが入ります。キーのハッシュ値によって格納先のバケットが決まり、平均的にO(1)の高速な検索が可能になります。
makeによる作成
makeを使って空のマップを作成できます。必要に応じてサイズのヒントを指定し、領域をあらかじめ確保することもできます。
package main
import "fmt"
func main() {
scores := make(map[string]int)
scores["x"] = 10
fmt.Println(scores)
}nilマップ
初期化せずに宣言したマップはnilです。nilマップから読み取ることはできます(ゼロ値が返されます)が、書き込むとパニックが発生します。書き込む前には必ず初期化してください。
package main
import "fmt"
func main() {
var m map[string]int
fmt.Println(m == nil)
fmt.Println(m["missing"])
}追加と更新
キーに値を代入すると、そのキーが新しい場合は追加され、既存の場合は値が上書きされます。
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
m["b"] = 2
m["a"] = 99
fmt.Println(m)
}キーの削除
組み込み関数deleteはキーを削除します。存在しないキーを削除しても、安全に何も起こりません。
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2}
delete(m, "a")
fmt.Println(m)
}マップの長さ
lenは、現在マップに格納されているキーと値のペアの数を返します。
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
fmt.Println(len(m))
}マップは自動的に拡張される
エントリを追加すると、Goは内部のテーブルを拡張し、キーを新しいバケットに再ハッシュすることがあります。これは自動的に行われるため、容量を手動で管理する必要はありません。
使用できるキーの型
キーには比較可能な型、つまり==で比較できる型を使用する必要があります。文字列、数値、ブール値、および比較可能なフィールドだけで構成された構造体を使用できます。スライスとマップはキーにできません。
package main
import "fmt"
func main() {
type Point struct{ X, Y int }
m := map[Point]string{{1, 2}: "origin-ish"}
fmt.Println(m[Point{1, 2}])
}参照セマンティクス
マップの値は、内部データへの参照です。マップを関数に渡すと、ポインタを使わなくても、その関数から同じマップを変更できます。
package main
import "fmt"
func addOne(m map[string]int) {
m["count"]++
}
func main() {
m := map[string]int{"count": 0}
addOne(m)
fmt.Println(m)
}確認問題
nilマップにキーを書き込もうとすると、どうなりますか。
まとめ
マップの内部構造:
- マップはバケットを持つハッシュテーブルです
- 検索、挿入、削除は平均O(1)です
- キーは比較可能でなければならず、nilマップへの書き込みではパニックが発生します
- マップは参照セマンティクスを持ちます
よくある質問
「mapの内部構造」レッスンは無料ですか?
はい。「mapの内部構造」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「mapの内部構造」で何を学びますか?
mapがデータを格納する仕組みを理解します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「mapの内部構造」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。