<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                Go 語言中的 map 在并發情況下,只讀是線程安全的,同時讀寫線程不安全。 下面來看下并發情況下讀寫 map 時會出現的問題,代碼如下: ~~~ package main func main() { //創建一個int到int映射 m := make(map[int]int) //開啟一段并發代碼 go func() { //不停對map進行寫入 for { m[1] = 1 } }() //開啟一段并發代碼 go func() { //不停對map進行讀取 for { _ = m[1] } }() for { ; } } ~~~ 運行代碼會報錯,輸出如下: ~~~ fatal error: concurrent map read and map write ~~~ 運行時輸出提示:并發的 map 讀寫。也就是說使用了兩個并發函數不斷地對 map 進行讀和寫而發生了競態問題。map 內部會對這種并發操作進行檢查并提前發現。 需要并發讀寫時,一般的做法是加鎖,但這樣性能并不高。Go 語言在 1.9 版本中提供了一種效率較高的并發安全的 sync.Map。sync.Map 和 map 不同,不是以語言原生形態提供,而是在 sync 包下的特殊結構。 sync.Map有以下特性: * 無須初始化,直接聲明即可。 * sync.Map 不能使用 map 的方式進行取值和設置等操作,而是使用 sync.Map 的方法進行調用。Store 表示存儲,Load 表示獲取,Delete 表示刪除。 * 使用 Range 配合一個回調函數進行遍歷操作,通過回調函數返回內部遍歷出來的值。Range 參數中的回調函數的返回值功能是:需要繼續迭代遍歷時,返回 true;終止迭代遍歷時,返回 false。 ~~~ package main import ( "fmt" "sync" ) func main() { var scene sync.Map // 將鍵值對保存到sync.Map scene.Store("greece", 97) scene.Store("london", 100) scene.Store("egypt", 200) // 從sync.Map中根據鍵取值 fmt.Println(scene.Load("london")) // 根據鍵刪除對應的鍵值對 scene.Delete("london") // 遍歷所有sync.Map中的鍵值對 scene.Range(func(k, v interface{}) bool { fmt.Println("iterate:", k, v) return true }) } ~~~ 代碼輸出如下: ~~~ 100 true iterate: egypt 200 iterate: greece 97 ~~~ 代碼說明如下: * 第 10 行,聲明 scene,類型為 sync.Map。注意,sync.Map 不能使用 make 創建。 * 第 13~15 行,將一系列鍵值對保存到 sync.Map 中,sync.Map 將鍵和值以 interface{} 類型進行保存。 * 第 18 行,提供一個 sync.Map 的鍵給 scene.Load() 方法后將查詢到鍵對應的值返回。 * 第 21 行,sync.Map 的 Delete 可以使用指定的鍵將對應的鍵值對刪除。 * 第 24 行,Range() 方法可以遍歷 sync.Map,遍歷需要提供一個匿名函數,參數為 k、v,類型為 `interface{}`,每次 Range() 在遍歷一個元素時,都會調用這個匿名函數把結果返回。 sync.Map 沒有提供獲取 map 數量的方法,替代方法是獲取時遍歷自行計算數量。sync.Map 為了保證并發安全有一些性能損失,因此在非并發情況下,使用 map 相比使用 sync.Map 會有更好的性能。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看