目錄
介紹
宣告
方式1
方式2
初始化
添加/修改
洗掉
查找
記憶體
遍歷
for range
排序
全部代碼
截圖
參考
介紹
- 參考型別
- Map 是一種無序的鍵值對的集合,Map 最重要的一點是通過 key 來快速檢索資料,key 類似于索引,指向資料的值,
- Map 是使用 hash 表來實作的,
- 鍵不能重復
- map自動擴容
宣告
方式1
var map 變數名 map[key_type]value_type
代碼
var m map[string]string
方式2
make函式
func make(Type, size IntegerType) Type
內建函式make分配并初始化一個型別為切片、映射、或通道的物件,其第一個實參為型別,而非值,make的回傳型別與其引數相同,而非指向它的指標,其具體結果取決于具體的型別:
映射:初始分配的創建取決于size,但產生的映射長度為0,size可以省略,這種情況下就會分配一個小的起始大小,
map的鍵必須是可以通過運算子== 來比較的資料型別,int、布爾、string、或包含前面的struct、陣列等
宣告時直接make
var 變數名 = make(map[key_type][value_type])
代碼
var m1 = make(map[string]string,5)
初始化
key:value形式,添加到花括號中,
代碼
m2 := map[string]string{"野王":"趙云"}
添加/修改
map[key] = value形式,沒有會添加,有了會覆寫,
代碼
m1["上官"] = "言為心聲"
m1["婉兒"] = "字為心畫"
m2["野王"] = "老虎"
m2["上單"] = "呂布"
洗掉
func delete(m map[Type]Type1, key Type)
內建函式delete按照指定的鍵將元素從映射中洗掉,若m為nil或無此元素,delete不進行操作,
delete(m1,"上官")
清空:重新make,沒有其他語言類似clear的函式
查找
m[key]回傳值和是否存在(bool型別)
val,flag := m2["野王"]
if flag{
fmt.Println("野王:",val)
}
記憶體
查看原始碼
src->runtime->map.go
// A header for a Go map.
type hmap struct {
// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.
// Make sure this stays in sync with the compiler's definition.
count int // # live cells == size of map. Must be first (used by len() builtin)
flags uint8
B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
hash0 uint32 // hash seed
buckets unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
nevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated)
extra *mapextra // optional fields
}
// A bucket for a Go map.
type bmap struct {
// tophash generally contains the top byte of the hash value
// for each key in this bucket. If tophash[0] < minTopHash,
// tophash[0] is a bucket evacuation state instead.
tophash [bucketCnt]uint8
// Followed by bucketCnt keys and then bucketCnt elems.
// NOTE: packing all the keys together and then all the elems together makes the
// code a bit more complicated than alternating key/elem/key/elem/... but it allows
// us to eliminate padding which would be needed for, e.g., map[int64]int8.
// Followed by an overflow pointer.
}
是哈希表實作,拉鏈法解決沖突,
遍歷
for range
for key,value := range m2{
fmt.Println(key,value)
}
排序
對key排序,然后遍歷
m2["野王2"] = "趙云"
m2["野王3"] = "瑪瑪哈哈"
m2["上單2"] = "馬超"
keys := []string{}
for key,_ := range m2{
keys = append(keys, key)
}
sort.Strings(keys)
fmt.Println("上單和野王排行榜:")
for _,key := range keys{
fmt.Println(key,m2[key])
}
注意:不是執行緒安全的,如果需要執行緒安全的,可以使用sync/Map,等到包的那一節會詳細展開,
全部代碼
package main
import (
"fmt"
"sort"
)
func main() {
//-------------宣告---------------
var m map[string]string
//----------宣告并分配空間------
var m1 = make(map[string]string,5)
m2 := map[string]string{"野王":"趙云"}
//---------添加和修改---------------
m1["上官"] = "言為心聲"
m1["婉兒"] = "字為心畫"
m2["野王"] = "老虎"
m2["上單"] = "呂布"
fmt.Println("m m1 m2:",m,m1,m2)
//----------洗掉-------------------
delete(m1,"上官")
fmt.Println("m1:",m1)
//------------查找-------------
val,flag := m2["野王"]
if flag{
fmt.Println("野王:",val)
}
//------------遍歷-------------
for key,value := range m2{
fmt.Println(key,value)
}
//------------排序------------
m2["野王2"] = "趙云"
m2["野王3"] = "瑪瑪哈哈"
m2["上單2"] = "馬超"
keys := []string{}
for key,_ := range m2{
keys = append(keys, key)
}
sort.Strings(keys)
fmt.Println("上單和野王排行榜:")
for _,key := range keys{
fmt.Println(key,m2[key])
}
}
截圖

參考
更多Go相關內容:Go-Golang學習總結筆記
有問題請下方評論,轉載請注明出處,并附有原文鏈接,謝謝!如有侵權,請及時聯系,如果您感覺有所識訓,自愿打賞,可選擇支付寶18833895206(小于),您的支持是我不斷更新的動力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/278917.html
標籤:區塊鏈
下一篇:Nvidia驅動失效問題解決方案
