Go语言syncMap LoadOrStore
<p>Go 语言 中 sync.Map 的 LoadOrStore 函数 表示,如果我们获取的 key 存在,那么就返回 key 对应的元素,如果获取的 key 不存在,那么就返回我们设置的值,并且将我们设置的值,存入 map。</p><h2>sync.Map LoadOrStore函数</h2>
<h3>语法</h3>
<div class="cnblogs_code">
<pre>func (m *Map) LoadOrStore(key, value <span style="color: rgba(0, 0, 255, 1)">interface</span>{}) (actual <span style="color: rgba(0, 0, 255, 1)">interface</span>{}, loaded <span style="color: rgba(0, 0, 255, 1)">bool</span>) </pre>
</div>
<h3>参数</h3>
<table style="float: left; height: 112px; width: 229px">
<thead>
<tr><th>参数</th><th>描述</th></tr>
</thead>
<tbody>
<tr>
<td><em>m</em></td>
<td>sync.Map 对象。</td>
</tr>
<tr>
<td><em>key</em></td>
<td>map 中元素的键。</td>
</tr>
<tr>
<td><em>value</em></td>
<td>map 中元素的值。</td>
</tr>
</tbody>
</table>
<p style="text-align: left"> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3>返回值</h3>
<table style="float: left">
<thead>
<tr><th>返回值</th><th>描述</th></tr>
</thead>
<tbody>
<tr>
<td><em>actual</em></td>
<td>获取到的值,或者被添加的值。</td>
</tr>
<tr>
<td><em>loaded</em></td>
<td>key 在 map 中是否存在。</td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3>说明</h3>
<p>在 map 中获取键为 key 的元素值,如果 key 存在,则将获取的值通过 actual 返回,loaded 返回 true。如果 key 不存在,那么就将 key 和 value 添加加 sync.Map,actual 返回 value,loaded 返回 false。</p>
<h2>案例</h2>
<h3>sync.Map LoadOrStore元素存在</h3>
<p>sync.Map LoadOrStore 元素存在,返回元素值和 ture</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package main
import (
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fmt</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sync</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
func main() {
fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">冰乐(https://www.cnblogs.com/taotaozhuanyong/)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">sync.Map LoadOrStore 元素存在,返回元素值和 ture</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> mapHaiCoder sync.Map
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Golang</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScript</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Vue</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Db</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Redis</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
fmt.Println(mapHaiCoder.LoadOrStore(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ServerData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
fmt.Println(mapHaiCoder.LoadOrStore(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScript</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScriptData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
}</span></pre>
</div>
<p>输出如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/1391054/202105/1391054-20210525093600905-249653708.png"></p>
<p>使用 LoadOrStore 获取 sync.Map 的元素时,如果 KEY 存在,那么返回 KEY 对应的元素值和 ture。</p>
<h3>sync.Map LoadOrStore元素不存在</h3>
<p>sync.Map LoadOrStore 元素不存在,返回设置的元素值和 false</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package main
import (
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fmt</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sync</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
func main() {
fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">冰乐(https://www.cnblogs.com/taotaozhuanyong/)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">sync.Map LoadOrStore 元素不存在,返回设置的元素值和 false</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> mapHaiCoder sync.Map
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Golang</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScript</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Vue</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Db</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Redis</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
fmt.Println(mapHaiCoder.LoadOrStore(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ServerData</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ServerData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
fmt.Println(mapHaiCoder.LoadOrStore(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScriptData</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScriptData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
}</span></pre>
</div>
<p>运行如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/1391054/202105/1391054-20210525093812611-104298129.png"></p>
<p>使用 sync.Map LoadOrStore 获取 sync.Map 的 KEY 不存在时,返回设置的元素值和 false。</p>
<h3>sync.Map LoadOrStore 元素不存在,添加元素</h3>
<p>使用 sync.Map Load 获取 KEY 不存在的元素时,会将 key 和 value 添加进 map</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package main
import (
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fmt</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sync</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
func walk(key, value </span><span style="color: rgba(0, 0, 255, 1)">interface</span>{})<span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)">{
fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Key =</span><span style="color: rgba(128, 0, 0, 1)">"</span>,key, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Value =</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, value)
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
}
func main() {
fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">冰乐(https://www.cnblogs.com/taotaozhuanyong/)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用 sync.Map Load 获取 KEY 不存在的元素时,会将 key 和 value 添加进 map</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> mapHaiCoder sync.Map
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Server</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Golang</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScript</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Vue</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Store(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Db</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Redis</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.LoadOrStore(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ServerData</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ServerData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.LoadOrStore(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScriptData</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">JavaScriptData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
mapHaiCoder.Range(walk)
}</span></pre>
</div>
<p>运行结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/1391054/202105/1391054-20210525094036670-1406445726.png"></p>
<p>首先,创建了一个三个元素的 sync.Map,接着我们再次使用 LoadOrStore 访问两个 key 都不存在的元素,最后我们使用 Range 遍历所有的元素。</p>
<p>此时,我们发现,使用 LoadOrStore 添加的两个新 KEY 和 VALUE 都存在了 map 中,即使用 LoadOrStore 访问不存在的元素时,元素会被添加进 map。</p>
<h2>Go语言sync.Map获取元素总结</h2>
<p>Go 语言中 sync.Map 的 LoadOrStore 函数表示,如果我们获取的 key 存在,那么就返回 key 对应的元素,如果获取的 key 不存在,那么就返回我们设置的值,并且将我们设置的值,存入 map。</p>
<p>Go 语言 sync.Map LoadOrStore 语法:</p>
<div class="cnblogs_code">
<pre>func (m *Map) LoadOrStore(key, value <span style="color: rgba(0, 0, 255, 1)">interface</span>{}) (actual <span style="color: rgba(0, 0, 255, 1)">interface</span>{}, loaded <span style="color: rgba(0, 0, 255, 1)">bool</span>) </pre>
</div>
<p>转载自:https://haicoder.net/golang/golang-syncmap-loadorstore.html</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/taotaozhuanyong/p/14807363.html
頁:
[1]