[実行]言語学習(f)の地図

地図

マップが無秩序に基づいてkey-value、データ構造、囲碁言語マップとスライスは参照型です、それは使用前に初期化する必要があります

マップの定義

ゴー言語の  map構文は次のように定義されます:

map[KeyType]ValueType

その中でも、

  • ます。KeyTypeは:債券の種類を示します。
  • ValueTypeに:キーに対応する値の種類を表します。

マップタイプ変数のデフォルトの初期値は、メモリを割り当てるためにメイク()関数を使用する必要がnilです構文は次のとおりです。

make(map[KeyType]ValueType, [cap])

どこでこのパラメータが必要とされていないが、キャップは、マップの容量を表し、私たちは、あなたがマップを初期化するとき、それを適切な容量を割り当てる必要があります

基本的な使用マップ

地図データはペアで発生している次のように、基本的なマップのサンプルコードは、次のとおりです。

/* 创建map,并初始化 */
	var m1 map[string]int
	fmt.Println(m1 == nil)        //true:还没有初始化(没有在内存中开辟空间)
	m1 = make(map[string]int, 10) //估算好map的容量,避免在程序运行期间在动态扩容
	m1["李子健"] = 100
	m1["lizijian"] = 10
	fmt.Println(m1)

出力:

true
map[lizijian:10 李子健:100]

また、それが宣言されたときの要素を満たすサポートマップ例えば、:

func main() {
	userInfo := map[string]string{
		"username": "李子健",
		"password": "123456",
	}
	fmt.Println(userInfo) //
}

地図データをフェッチするために、

/* 向map中取数据,(会返回两个值,value和ok一起接受)
	   约定熟成用ok接受返回的bool值 */
	value, ok := m1["李子健"]

	if !ok {
		fmt.Println("查无此key")
	} else {
		fmt.Println(value)
	}

マップトラバーサル

囲碁の言語が使用for rangeマップを横断します。

/* 遍历map值 */
	for key, value := range m1 {
		fmt.Println(key, value)
	}

注:  キーと値のペアを追加するために関係なく、オーダーのマップを横断要素。

キーと値のペアを削除するには、delete()関数を使用します

使用delete()ビルトイン機能マップからペアのセットキーを削除するにはdelete()、次のような機能をフォーマットします:

delete(map, key)

その中でも、

  • マップ:あなたDeleteキーと値のペアをマップ
  • キー:キーを削除するには、キーと値のペアを表し、

次のようにサンプルコードは次のとおりです。

/* 删除map */
	delete(m1, "lizijian")
	delete(m1, "lijiayang") //删除不存在的值不报错
	fmt.Println(m1)

トラバーサル順序指定されたマップ

/* 按照指定的key值顺序取出值 */

	m2 := make(map[string]int, 100)
	// 生成一个随机的map
	for i := 0; i < 100; i++ {
		key := fmt.Sprintf("stu%02d", i) //比较重要
		value := rand.Intn(100)
		m2[key] = value
	}
	fmt.Println(m2)
	//用一个切片keys去存储map中所有的key值
	var keys = make([]string, 0, 200)
	for key := range m2 {
		keys = append(keys, key)
	}
	//对切片进行排序
	sort.Strings(keys)

 	//通过排好序的keys中的key去遍历map
	for _, key := range keys {
		fmt.Println(key, m2[key])
	} 

マップ要素のタイプは、スライスしました

次のコードは、素子部の動作を示す場合、マップタイプ:

/* 元素为map类型的切片 */
	mapslice := make([]map[int]string, 10, 10)
        //初始化一个类型为map的切片
	for i, v := range mapslice {
		fmt.Println(i, v)
	}

	//对切片中的map元素进行初始化
	mapslice[0] = make(map[int]string, 10)
	mapslice[0][1] = "小王子"
	for index, value := range mapslice {
		fmt.Println(index, value)
	}

注:スライスやマップが参照型、時間の使用が初期化するのに必要とされています

スライスタイプ値マップ

次のコードに示すアクションのマップ値スライスタイプ:

    /*值为切片类型的操作:*/
	sliceMap:=make(map[string][]int,10)
	value1:=make([]int,10,10)//很重要
	sliceMap["李子健"]=value1//很重要
	for key,value:=range sliceMap{
		fmt.Println(key,value)
	}

新しいの違いに注意してくださいと作ります

例で見てみましょう:

func main() {
	var a *int
	*a = 100
	fmt.Println(*a)

	var b map[string]int
	b["沙河娜扎"] = 100
	fmt.Println(b)
}

上記のコードの実装は、なぜ、パニックにつながるのだろうか?参照型の変数で言語に移動し、我々は、使用時にはそれを宣言しなければならないだけでなく、そのためのメモリ空間を割り当てるために、そうでない場合、我々は店の価値に方法がありません。彼らは、宣言の時に割り当てられた適切なデフォルトのメモリ空間を持っているため、ステートメントの型の値については、あなたは、メモリ空間を割り当てる必要はありません。メモリを割り当てるには、それが今日の新しい、メイクを導出します。移動して、新しい言語は、組み込み関数、主にメモリを割り当てるために2つを使用している作ります。

新着

新しい組み込み関数、その関数のシグネチャは次の通り:

func new(Type) *Type

その中でも、

  • タイプはタイプである、新しい関数がパラメータを受け入れ、型を示します
  • *タイプは、新しい機能がメモリアドレス型へのポインタを返し、ポインタの型を示します。

あまり一般的で新しい機能は、得られた新しい機能を使用すると、ポインタの種類とポインタの種類に対応するゼロ値の値です。例えば:

func main() {
	a := new(int)
	b := new(bool)
	fmt.Printf("%T\n", a) // *int
	fmt.Printf("%T\n", b) // *bool
	fmt.Println(*a)       // 0
	fmt.Println(*b)       // false
}	

このセクションの最初のサンプルコードでは、var a *int唯一のポインタ変数を宣言していますが、それに割り当てることができ、後に参照型としてポインタを初期化し、メモリ空間を初期化する必要がありませんでした。あなたが使用する必要があり、新しい組み込み関数は次のように初期化のための彼らの割り当て後に正常であることができます。

func main() {
	var a *int
	a = new(int)
	*a = 10
	fmt.Println(*a)
}

メイク

また、メモリ割り当てのために作る新しい、のみ使用スライスは異なる、ちゃんのメモリをマッピングして作成し、これらの3種類があるため、戻り値の型が、それは、むしろ彼らのポインタ型よりも、これら3種類そのものであります参照型なので、彼らの手にまで戻る必要はありません。関数のシグネチャは、次の機能を行います。

func make(t Type, size ...IntegerType) Type

メイク機能は、我々はあなたがそれらを操作する前に初期化するために行うために、スライス、マップ、チャネル、彼らの両方の必要性を使用し、かけがえのないです。私たちは前の章で説明してきたこれは、私たちは、以降の章では、チャネルについて詳細に説明します。

始まるこのセクションの例var b map[string]intだけで変数bを宣言するには、型マップの変数であり、そして、キーと値のペアを割り当てることができますメイク使用初期化関数として次のサンプルコードのようなものが必要になります。

func main() {
	var b map[string]int
	b = make(map[string]int, 10)
	b["沙河娜扎"] = 100
	fmt.Println(b)
}

新規および違いを作ります

  1. 双方は、メモリ割り当てのために使用されます。
  2. 唯一のスライス、マップ、チャネル、または基準自体の三種類のリターンを初期化します。
  3. そして、メモリ割り当て、メモリのタイプとリターンポインタのゼロ値に対応する値の新しいタイプのためのポインタ型です。

​​​​​​​

ここリファレンス週のブログ・レヴィン、そして自分自身の理解のいくつかを追加

 

公開された14元の記事 ウォン称賛7 ビュー1527

おすすめ

転載: blog.csdn.net/weixin_39966701/article/details/105337108