マップのデータ構造は、他のプログラミング言語では辞書 ( Python )、ハッシュ、HashTable とも呼ばれます。
マップのコンセプト
map は参照型であり、次のように宣言できます。
var mapname map[keytype]valuetype
の:
- mapname はマップの変数名です。
- keytype はキーのタイプです。
- valuetype は、キーに対応する値のタイプです。
ヒント: [keytype] と valuetype の間にはスペースを使用できます。
マップは動的に拡大することができ、初期化されていないマップの値は nil であり、マップ内のペアの数は関数 len() を使用して取得できるため、宣言時にマップの長さを知る必要はありません。 。
【例】
package main
import "fmt"
func main() {
var mapLit map[string]int
//var mapCreated map[string]float32
var mapAssigned map[string]int
mapLit = map[string]int{"one": 1, "two": 2}
mapCreated := make(map[string]float32)
mapAssigned = mapLit
mapCreated["key1"] = 4.5
mapCreated["key2"] = 3.14159
mapAssigned["two"] = 3
fmt.Printf("Map literal at \"one\" is: %d\n", mapLit["one"])
fmt.Printf("Map created at \"key2\" is: %f\n", mapCreated["key2"])
fmt.Printf("Map assigned at \"two\" is: %d\n", mapLit["two"])
fmt.Printf("Map literal at \"ten\" is: %d\n", mapLit["ten"])
}
出力結果:
Map literal at “one” is: 1
Map created at “key2” is: 3.14159
Map assigned at “two” is: 3
Map literal at “ten” is: 0
この例では、mapLit は、配列や構造体と同様に{key1: value1, key2: value2}
の形式を使用してマップを初期化することを示しています。
上記のコードにおけるmapCreatedの作成メソッドmapCreated := make(map[string]float)
mapCreated := map[string]float{}
と同等です。
mapAssigned は、mapList への参照であり、mapAssigned の変更は、mapLit の値にも影響します。
注: make() は使用できますが、new() を使用してマップを構築することはできません。誤って new() を使用して参照オブジェクトを割り当てると、null 参照へのポインタが取得されます。これは、宣言するのと同じです。初期化されていない変数を受け取り、そのアドレスを取得します。
mapCreated := new(map[string]float)
次に、 mapCreated["key1"] = 4.5
を呼び出すと、コンパイラはエラーを報告します。
invalid operation: mapCreated[“key1”] (index of type *map[string]float).
マップ容量
配列とは異なり、マップは新しく追加されたキーと値に応じて動的にスケーリングできるため、固定長や最大制限はありませんが、マップの初期容量を示すように選択することもできます。以下に続きます:
make(map[keytype]valuetype, cap)
例えば:
map2 := make(map[string]float, 100)
マップが容量の上限に達した場合、新しい Key-Value を追加すると、マップのサイズは自動的に 1 ずつ増加します。そのため、パフォーマンス上の理由から、大きなマップや急速に拡大するマップの場合は、容量は大まかにしか分からないので、最初にマークしておくのも良いでしょう。
以下は、音階を対応するオーディオにマッピングするマップの具体的な例です。
noteFrequency := map[string]float32 {
"C0": 16.35, "D0": 18.35, "E0": 20.60, "F0": 21.83,
"G0": 24.50, "A0": 27.50, "B0": 30.87, "A4": 440}
ノートフリークエンシー:= map[string]float32{
"C0":16.35、「D0」:18.35、「E0」:20.60、「F0」:21.83、
「G0」:24.50、「A0」:27.50、「B0」:30.87、「A4」:440}
キーは 1 つの値にのみ対応し、値はプリミティブ型であるため、キーが複数の値に対応する必要がある場合はどうすればよいでしょうか。たとえば、Unix マシン上のすべてのプロセスを処理したい場合、親プロセス (pid は整数) がキーとして使用され、すべての子プロセス (すべての子プロセスの pid で構成されるスライス) がキーとして使用されます。価値。この問題は、value を []int 型またはその他の型のスライスとして定義することでエレガントに解決できます。サンプルコードは次のとおりです。
mp1 := make(map[int][]int) // mp1をint型のキーとint型のスライスで初期化する
mp2 := make(map[int]*[]int) // mp2をint型のキーとスライス型のポインタで初期化する