<small id="ofp8r"><progress id="ofp8r"></progress></small>
  • <strong id="ofp8r"><nav id="ofp8r"></nav></strong>

    <var id="ofp8r"></var>
  • <video id="ofp8r"><small id="ofp8r"></small></video>
  • <thead id="ofp8r"></thead>

    Go語言中的map

    map在Go語言
    其中一個最有用的數據結構在計算機科學是散列表。 有許多實現的散列表與不同的性質,但在一般情況下它們提供了迅速查找,外,并刪除。 去提供了一個內置的 map 的類型,實現了一散列表。

    Go語言中的map

    初始化
    該map的類型在去是這樣的:

    map[KeyType]ValueType
    在KeyType可以是任何類型的可比性(在此以后),并ValueType可以是任何類型的所有人,包括另外一個map!

    這可變米是map串鑰匙int值:

    var m map[string]int
    map的類型的基準類型,例如指針或片,并使米以上的價值為零;它不點的初始化map。 一個空map的行為就像一個空map閱讀時,但是嘗試寫入空map將導致運行時恐慌。 初始化的map,利用內在的使功能:

    m = make(map[string]int)
    使功能的分配和初始化的散列的map的數據結構以及返回地的價值這一點。 該方案的詳細信息的數據結構是實施細節的運行環境和不限定的語言本身。 在這個職位,我們將重點放在使用的map,不執行它們。

    map
    去提供了一個熟悉的語法使用的map。 這個聲明闡述的"路線"的關鍵66:

    m["route"] = 66
    這一聲明可檢索的價值存在"路線"的關鍵,并將其分配給新的可變i:

    i := m["route"]
    如果所請求的關鍵并不存在,我們得到空值的價值的類型。 在這種情況下,價值類型是整數,因此空值為0:

    j := m["root"]
    // j == 0
    內建len功能返回的數量元素的map:

    n := len(m)
    內刪除功能刪除一個項目在map上:

    delete(m, "route")
    刪除功能返回沒什么,沒什么,如果指定的關鍵并不存在。

    分配測試有兩個價值觀存在的關鍵:

    i, ok := m["route"]
    在該聲明中,第一個值(i)分配的價值存在"路線"的關鍵。 如果此項不存在,我是一個空值的價值類型(0). 第二個值("ok")是一個布爾(bool)價值,其具有的價值如果真的關鍵存在于map,和價值的虛假的,如果沒有。

    檢查的關鍵,而不提取的數值時,使用下劃線而不是第一個值:

    _, ok := m["route"]
    迭代map的內容,使用范圍的關鍵詞:

    for key, value := range m {
    fmt.Println("Key:", key, "Value:", value)
    }
    初始化的map與一些數據,使用的map的文字:

    commits := map[string]int{
    "rsc": 3711,
    "r": 2138,
    "gri": 1908,
    "adg": 912,
    }
    相同的語法可以用來初始化空map,這在功能上等同于使用的做功能。:

    m = map[string]int{}
    使用空值
    它可以方便地搜索返回的一個空值鍵時失蹤。

    例如,一個mapbool值可以被用作數據結構類似于一個組(記得,空值bool類型是假)。 這個例子看起來在聯系的節點列表,并指紋他們的價值觀。 它使用一個地點的指針,以檢測循環中的列表。

    type Node struct {
    Next *Node
    Value interface{}
    }
    var first *Node

    visited := make(map[*Node]bool)
    for n := first; n != nil; n = n.Next {
    if visited[n] {
    fmt.Println("cycle detected")
    break
    }
    visited[n] = true
    fmt.Println(n.Value)
    }
    表訪問了[n]是真實的,如果n訪問,或假如果是不存在的。 沒有必要使用兩種價值的形成,以檢查n在map上;默認值為零,這對于我們。

    另一個例子的有用的空值的切片圖. 當添加到一個空片,一個新的片是簡單地分配,所以加入一個值的切片圖是一個行操作;沒有必要檢查如果關鍵的存在。 在下面的例子中,一群人是填充的價值的人。 每個人都有一個名字和一個跨部分的喜歡。 這個例子創建一個map的鏈接每個喜歡的一群人喜歡它。

    type Person struct {
    Name string
    Likes []string
    }
    var people []*Person

    likes := make(map[string][]*Person)
    for , p := range people { for , l := range p.Likes {
    likes[l] = append(likes[l], p)
    }
    }
    打印的名單人喜歡奶酪:

    for _, p := range likes["cheese"] {
    fmt.Println(p.Name, "likes cheese.")
    }
    打印的人員的數量喜歡熏肉:

    fmt.Println(len(likes["bacon"]), "people like bacon.")
    注意,由于范圍和len享零片作為一個長度為零片,這些最后的兩個例子將工作,甚至如果沒有人喜歡熏肉奶酪或(盡管這是不可能的).

    關鍵類型
    如前所述,map鑰匙可以是任何類型是相當的。 語言規范規定了這種確切的,但在短期,相當類型布爾、數字、指針、管和接口類型,以及結構或陣列,僅含有這些類型。 部分,map,和功能都缺少清單。 這些類型的無法相比,使用==不可用作map鍵。

    顯然,串,整數和其他基本類型,應可為map鍵,但結構鍵可能意想不到的。 結構可用于關鍵的數據在多個層面。 例如,可以使用這種map的map,以數計的網頁訪問的國家:

    hits := make(map[string]map[string]int)
    這是一張map的串(map的串int)。 每一個外部map的關鍵路徑的網頁與其自己內部的map。 每個內部關鍵的卡是一個雙字母國家代碼。 這種表達返回的次數,一個澳大利亞已加載的文件頁:

    n := hits["/doc/"]["au"]
    不幸的是,這種辦法變得麻煩的時候添加數據,作為用于任何特定外國的關鍵,你要檢查,如果一個內部的map存在,并創建它,如果有必要的:

    func add(m map[string]map[string]int, path, country string) {
    mm, ok := m[path]
    if !ok {
    mm = make(map[string]int)
    m[path] = mm
    }
    mm[country]++
    }
    add(hits, "/doc/", "au")
    另一方面,一個設計,使用一個單一的map是一個結構的關鍵消除了所有這一復雜性:

    type Key struct {
    Path, Country string
    }
    hits := make(map[Key]int)
    當一名越南人訪問該主頁,增加(并可能創建)相對應的柜臺在一個線:

    hits[Key{"/", "vn"}]++
    它只是作為容易看到許多瑞士人民已經閱讀規范:

    n := hits[Key{"/ref/spec", "ch"}]
    競爭力
    map是不安全的競爭性使用:這是不是定義發生了什么,當你讀和寫到他們在同一時間。 如果你需要閱讀和書寫的map,從競爭性地執行去的程序(go程序),訪問必須提供的一些同步機制。 一個最常見的方式來保護卡是同步的。 RWMutex.

    該聲明宣布一個計數變量,這是一個匿名的結構中含有一張map和內同步。 RWMutex.

    var counter = struct{
    sync.RWMutex
    m map[string]int
    }{m: make(map[string]int)}
    閱讀,從柜臺,使用的閱讀鎖定:

    counter.RLock()
    n := counter.m["some_key"]
    counter.RUnlock()
    fmt.Println("some_key:", n)
    到寫信給反,使用寫的鎖定:

    counter.Lock()
    counter.m["some_key"]++
    counter.Unlock()
    迭代了
    當迭代map的使用范圍循環,順序的迭代的是沒有指定,它不能保證,它將同從一個迭代的下一步。 如果你需要一個穩定的迭代了,你必須保持一個獨立的數據結構定義這個順序。 這個例子使用一個單獨的排序關鍵片打印map[int]串鍵的順序:

    import "sort"

    var m map[int]string
    var keys []int
    for k := range m {
    keys = append(keys, k)
    }
    sort.Ints(keys)
    for _, k := range keys {
    fmt.Println("Key:", k, "Value:", m[k])
    }

    本文來自投稿,不代表親測學習網立場,如若轉載,請注明出處:http://www.ellastina.com/golang-map.html

    鄭重聲明:

    本站所有內容均由互聯網收集整理、網友上傳,并且以計算機技術研究交流為目的,僅供大家參考、學習,不存在任何商業目的與商業用途。 若您需要商業運營或用于其他商業活動,請您購買正版授權并合法使用。

    我們不承擔任何技術及版權問題,且不對任何資源負法律責任。

    如遇到資源無法下載,請點擊這里失效報錯。失效報錯提交后記得查看你的留言信息,24小時之內反饋信息。

    如有侵犯您的版權,請給我們私信,我們會盡快處理,并誠懇的向你道歉!

    (0)
    上一篇 2023年10月8日 下午9:13
    下一篇 2023年10月10日 下午6:48

    猜你喜歡

    色爱综合激情五月激情,久久久久久精品免费免费直播,国产成人欧美精品视频,亚洲精品无码不卡在线观看P
    <small id="ofp8r"><progress id="ofp8r"></progress></small>
  • <strong id="ofp8r"><nav id="ofp8r"></nav></strong>

    <var id="ofp8r"></var>
  • <video id="ofp8r"><small id="ofp8r"></small></video>
  • <thead id="ofp8r"></thead>