GoLang学習ノート(25)mapの宣言、付与、遍歴、キー値ペアの削除

4344 ワード

mapはGo言語の内蔵タイプで、1つの値を1つのキーに関連付け、対応する検索を使用することができます.地図、マッピング、または辞書(python)に翻訳され、より多くの翻訳は集合(java)mapとして無秩序なキー値対(key-value pair)の集合であり、mapはkeyによってデータを迅速に取得し、keyはインデックスに類似し、郷音のvalue値を指す.mapは配列を遍歴してスライスと同じように遍歴できる集合であるが,mapは無秩序であるため,mapが示す順序を決定することはできない.これはmapがhashテーブルを用いて実現されるためである.mapは無秩序で、印刷されるたびにmapが異なり、indexで取得することはできません.keyで取得する必要があります.mapの長さは固定されず、sliceスライスと同様に拡張でき、内蔵len()関数はmapに同様に適用され、mapが持つキー値ペアの数を返すが、mapはcap()関数で容量を計算できない、あるいはcap()関数のパラメータはmapではない.同じmapではkeyが一意性を保証する必要があります.keyのデータ型は比較演算に参加できるタイプ、すなわち=または!=ブール、整数、浮動小数点、文字列、配列などの操作のタイプ.スライス、関数、mapなどの参照タイプではだめです.mapのvalueは任意のデータ型であってもよい.sliceと同様にmapも参照タイプです.
 
 var mapキーワードを使用してmapを宣言する フォーマット:var変数名map[keyタイプ]valueタイプ varは変数を宣言し、デフォルトmapはnilであり、nil mapはキー値ペアを格納するために使用できません. var宣言後、宣言時に初期化するか、make()関数を使用してメモリ領域に割り当てるかで、キー値ペアを格納できます.
func testVar() {
	var map1 map[string]string
	fmt.Printf("%T,%v,len()=%d,nil?%v", map1, map1, len(map1), map1 == nil)
	//map[string]string,map[],len()=0,nil?true
}

make関数を使用してmapフォーマットを宣言します.変数名:=make(map[keyタイプ]valueタイプ)この宣言方式は、mapを初期化しない場合、mapもnilに等しくありません.
func testMake() {
	map2 := make(map[string]string)
	fmt.Printf("%T,%v,len()=%d,nil?%v", map2, map2, len(map2), map2 == nil)
	//map[string]string,map[],len()=0,nil?false
}

 Mapを宣言した後、直接値を割り当てます.
func testMap1() {
	//     ,         , 
	var m1 = map[string]string{
		"HuBei":    "WuHan",
		"HuNan":    "ChangSha",
		"JiangSu":  "NanJing",
		"ZheJiang": "NingBo",
	}
	//     ,         “,” ,   “,”      
	m2 := map[string]string{"HuBei": "WuHan", "HuNan": "ChangSha", "JiangSu": "NanJing", "ZheJiang": "NingBo"}
	fmt.Printf("%T,%v,len()=%d,nil?%v 
", m1, m1, len(m1), m1 == nil) fmt.Printf("%T,%v,len()=%d,nil?%v
", m2, m2, len(m2), m2 == nil) }

Mapを宣言した後、mapに値を割り当てます.
func testMap2() {
	m1 := make(map[string]string)
	m1["HuBei"] = "WuHan"
	m1["HuNan"] = "ChangSha"
	m1["JiangSu"] = "NanJing"
	m1["ZheJiang"] = "NingBo"
	fmt.Printf("%T,%v,len()=%d,nil?%v 
", m1, m1, len(m1), m1 == nil) }

mapを巡る.
var m0 = map[string]string{"HuBei": "WuHan", "HuNan": "ChangSha", "JiangSu": "NanJing", "ZheJiang": "NingBo"}
//  key value
func testRangeMap1() {
    for k,v := range m0{
    	fmt.Println(" :",k,",  :",v)
	}
}

mapのvalueを巡る
func testRangeMap2() {
    for _,v := range m0{
    	fmt.Println("  :",v)
	}
}

mapのkeyを巡る
func testRangeMap3() {
    for k := range m0{
    	fmt.Println(" :",k)
	}
}

エレメントがコレクションに存在するかどうかを確認します.map[key]キーが存在しない場合、stringタイプでは空の文字列、intタイプでは0などのvalue値タイプのデフォルト値が得られますが、プログラムはエラーを報告しません.したがってvalue,ok:=map[key]によりkey/valueが存在するか否かを取得することができ,okはbool型であり,trueであればそのキー値ペアが存在する.
func findMapKey1() {
	val1,ok1 := m0["HuBei"]
	fmt.Println(val1,ok1)
	val2,ok2 := m0["HeiLongJiang"]
	fmt.Println(val2,ok2)
}
func findMapKey2(str string,m map[string]string) {
	val,ok := m[str]
	if ok {
		fmt.Println("   ",str,"     :",val)
	} else {
		fmt.Println("        ")
	}
}
//findMapKey2     
func findMapKey3(str string,m map[string]string) {
	if val,ok := m[str];ok {
		fmt.Println("   ",str,"     :",val)
	} else {
		fmt.Println("        ")
	}
}

delete(map,key)関数は、mapと対応するkeyのパラメータを持つ集合の要素を削除するために使用されます.
関数を削除しても値は返されません.
func deleteMap1() {
	fmt.Printf("    :%T,%v,len()=%d,nil?%v 
", m0, m0, len(m0), m0 == nil) if _,ok := m0["HuNan"];ok{ delete(m0,"HuNan") } fmt.Printf(" :%T,%v,len()=%d,nil?%v
", m0, m0, len(m0), m0 == nil) }

Go言語はmapにすべての要素をクリアする関数を提供していません.mapを空にする唯一の方法は、mapを新規作成し、ターゲットmapに割り当てることです.
func deleteMap2() {
	fmt.Printf("    :%T,%v,len()=%d,nil?%v 
", m0, m0, len(m0), m0 == nil) m0 = map[string]string{} fmt.Printf(" :%T,%v,len()=%d,nil?%v
", m0, m0, len(m0), m0 == nil) }