0Pricing
Go Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. mapの内部構造
  2. 存在確認
  3. 集合としてのmap
  4. 反復処理と順序
← Go Academyに戻る