ゴラン地図

18059 ワード

導入


シリーズの第7部では、マップをカバーします.我々は、配列やスライスのようないくつかの基本的なデータ構造をカバーしている今、マップやハッシュテーブルに移動することができます.マップを使用すると、特定の型のキー値ペアを格納できます.シリーズのこの部分では、我々はGolangのような宣言、反復、マップの基本をカバーし、作成、更新、およびマップからキーを削除します.

ゴランの地図


Golangの地図は、キー値ペアを格納する方法を提供するデータ構造です.ハッシュテーブルとしても知られている.マップは、値に関連付けられているユニークなキーを作成することができます.これは、特定の値に関連付けられている項目を持つことができるデータ構造を作成するために使用することができます、例えば、マップの基本的な例は、数字のリストの周波数テーブルであることができます.リスト内で発生する各要素の周波数を格納できます.のリストを持っているとしましょう[3, 5, 9, 4, 9, 5, 5] , これらの要素の周波数のマップを作成することができます[3:1, 5:3, 4:1, 9:2] . ここで、私たちは情報をkey-value 周波数としての対それで3 一度に発生した.5 3回など.
マップは、私たちが手動で必要な順序でソートする必要があるので、彼らが未注文の数の順序で格納されていません.

マップの宣言


マップの種類を定義することでマップを宣言できます.私たちは他のどんな型でもマップすることができます、整数、整数、私たちが以前見たような整数を持つ文字のように.私たちはマップリテラル、make関数、新しい関数、およびいくつかの他を使用するように、golangでdecalreマップにいくつかの方法を持っています.ひとりひとり簡単に調べてみよう.

簡易マップリテラル


配列とスライスで見たとき、スライスリテラルを使用して配列またはスライスを宣言して初期化しました.同様に、マップリテラルを使用してゴランで地図を作成できます.ここでは、我々はmap キーワードは、私たちがマップしようとしている2種類のデータを続きます.
package main

import "fmt"

func main() {

    char_freq := map[string]int{
        "M": 1,
        "e": 2,
        "t": 1,
    }
    fmt.Println(char_freq)
}
$ go run map.go
map[M:1 e:2 t:1]
マップキーワードを使用してマップを初期化しましたstring with int . 最初のデータ型は角括弧内で宣言される[] そして、角括弧の外側の2番目のデータ型.我々は{} マップ値を定義する.我々は、去ることさえできます{} 空.
char_freq := map[string]int{}
この例のデータ型のデータを指定する"" 続いてコロン: そして最後に2番目のペアデータの値.それぞれの値はコンマで区切られます(, ).

make関数の使用


我々も、使用することができますmake Golangで地図を作成する機能.make関数はメモリの割り当てに使用します.make関数は提供される初期値に十分なメモリを割り当てます.これは、マップのサイズが大きくなると、より多くのメモリを割り当てます.我々は、make関数を使用してmap キーワードは、キー値のペアのデータ型と一緒にマップされます.必要に応じて、スライス宣言で提供する容量を提供できます.それが限界に達して、再割り当てられるならば、それは基本的に倍になります.
marks := make(map[int]int)
marks[65] = 8
marks[95] = 3
marks[80] = 5
fmt.Println(marks)
$ go run map.go
map[65:8 80:5 95:3]
私たちはmake マップを宣言するための関数は、初期のサイズは約7を説明していない場合です.それが7を打つと、容量はほとんど倍増し、変更ごとに増加します.

新しい関数の使用


我々も、使用することができますnew 関数は、ゴングで地図をcrackingするビット.新しい関数は基本的にメモリを割り当てるのに使用されますが、make 関数は割り当てられたポインタにメモリアドレスを返す.したがって、新しい関数の戻り関数コールの値をポインタ変数で設定することができます.ゴロのポインターは単にメモリアドレスへのリファレンスです、我々は異なるセクションのポインタに飛び込みます.ポインタがメモリアドレスを割り当てられた後、そのポインタのアドレスを参照でき、マップ自体である元の値にアクセスできます.
name := new(map[byte]int)
*name = map[byte]int{}
name_map := *name

name_map['m'] = 1
name_map['e'] = 2
name_map['t'] = 1

fmt.Println(name_map)

for k, _ := range name_map {
    fmt.Printf("%c\n", k)
}
$ go run map.go
map[101:2 109:1 116:1]
m
e
t
それで、我々は新しい機能で地図を作成して、アドレスをポインタに格納するのを見ることができます.次に、マップを通常のマップとして使用できるように、マップを最終的に別の変数に格納できます.そこで、新しい関数を使ってマップを宣言する方法です.

マップ内のアクセスキーと値


私たちは単にキーでそれらをアクセスすることによって値にアクセスできます.角括弧とキーリテラルをブレースに使用して、キーに関連付けられた値を取得します.例えば、マップ["M": 1, "E": 2, "T":1] , 私たちはmap_name["E"] として3 .

マップの長さ


マップの長さはlen関数を使用してアクセスできます.len関数はマップ内のキー値ペアの数を返します.
char_freq := map[string]int{
    "M": 1,
    "e": 2,
    "t": 1,
}
fmt.Println(char_freq)
fmt.Println(len(char_freq))
$ go run map.go
map[M:1 e:2 t:1]
3

マップ内の既存のキーをチェック


コンマOK構文を使用してキーがマップに存在するかどうかを確認できます.キーは、最初の変数を使用してアクセスでき、キーが存在しない場合は、2番目の変数がfalseに設定されます.そこで,2変数法を用いて地図中のキーの存在を確認することができる.
name_map := map[byte]int{
    'm': 1,
    'e': 2,
    't': 1,
}
var key byte = 't'
value, exist := name_map[key]
if exist == true {
    fmt.Printf("The key %c exist and has value %d\n", key, value)
} else {
    fmt.Printf("The key %c does not exist.\n", key)
}
$ go run map.go
The key t exist and has value 1
したがって、キーが存在していなければ、存在する値が真であることがわかります.

マップ内のキー/値の追加と変更


初期設定プロセスでキーを使用してキー値ペアをマップに追加できます.我々は、単に角括弧でキーを渡します[] そして、それをマップで使用されるデータ型に適切な値を割り当てます.
cart_list := map[string]int{
    "shirt": 2,
    "mug": 4,
    "shoes": 3,
}

fmt.Println(cart_list)

cart_list["jeans"] = 1
cart_list["mug"] = 3
fmt.Println(cart_list)
$ go run map.go
map[mug:4 shirt:2 shoes:3]
map[jeans:1 mug:3 shirt:2 shoes:3]
キーを使用してマップ内のキーにアクセスすることができますし、それを保持する値を変更すると、同じ値は、キー値のペアの追加に適用される、我々はキーを使用して、それに関連付けられている値を割り当てることができます.

マップ内のキーを削除する


マップでキー値ペアを削除することができますdelete 関数.私たちはkey そしてマップからキー値ペアを削除するマップ.
cart_list := map[string]int{
    "shirt": 2,
    "mug":   4,
    "shoes": 3,
}
fmt.Println(cart_list)

cart_list["jeans"] = 1
cart_list["mug"] = 3
delete(cart_list, "shoes")

fmt.Println(cart_list)
$ go run map.go
map[mug:4 shirt:2 shoes:3]
map[jeans:1 mug:3 shirt:2]
それで、キー値ペアが地図から削除されるのを見ることができます.

地図を反復する


スライスと配列の範囲キーワード反復処理と同様のマップを反復処理することができますが、ここでの例外は、インデックスの代わりにキー、値、マップ内の要素のコピーを範囲として使用することです.
is_prime := map[int]bool{
    7:  true,
    9:  false,
    13: true,
    15: false,
    16: false,
}

for key, value := range is_prime {
    fmt.printf("%d -> %t\n", key, value)
}
$ go run map.go
9 -> false
13 -> true
15 -> false
16 -> false
7 -> true
それで、我々は地図の上で反復するために範囲キーワードを使用している地図でキーと値にアクセスすることができることを観察することができます.forループでは、マップ内の割り当てられた値を参照できます.

反復しながらキーまたは値のみを使用する


我々が変数のどちらも使用しないならばkey or value , コンパイラは未使用の変数エラーを与えるかもしれませんので、don ' t care変数_ アンダースコア文字.
is_prime := map[int]bool{
    7:  true,
    9:  false,
    13: true,
    15: false,
    16: false,
}

for key, _ := range is_prime {
    fmt.Printf("Key : %d\n", key)
}

for _, value := range is_prime {
    fmt.Printf("Value: %t\n", value)
}
$ go run map.go
Key : 7
Key : 9
Key : 13
Key : 15
Key : 16
Value: true
Value: false
Value: true
Value: false
Value: false
だから、我々は_ ループ内の変数の使用を無視するには、変数を使用していない場合はアンダースコア演算子で完全に無視することができます.そこで、ここではアクセスキーのみを使いたい場合にはkey, _ キーのみを取得し、マップ内の値を静的に取得します.値だけにアクセスしたいならば、我々は使用できます_, value マップからすべての値を得るために.変数名key or value ループ内のみを使用してください.
それはこの部分からです.すべてのコード例とコマンドの参照は100 days of Golang githubリポジトリ.

結論


そこで、このシリーズの一部から、ゴングの地図の基本を理解することができました.我々は、宣言、初期化、および反復を含むいくつかの基本的なものをカバーしました.マップは非常に簡単ですが、興味深いアプリケーションを作成するために重要です.
お読みありがとうございます.ご質問やご意見がある場合は、コメントや社会的なハンドルで私に知らせてください.ハッピーコーディング