教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang 遍历时元素指针问题(转载)

golang 遍历时元素指针问题(转载)

发布时间:2022-01-05   编辑:jiaochengji.com
教程集为您提供golang 遍历时元素指针问题(转载)等资源,欢迎您收藏本站,我们将为您提供最新的golang 遍历时元素指针问题(转载)资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h3>问题</h3>

golang 执行for 遍历时取value的指针时容易出错

<h3>
代码实现</h3> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"log"</span> <span class="token string">"time"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> student <span class="token keyword">struct</span> <span class="token punctuation">{</span> Name <span class="token builtin">string</span> Age <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> m <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">*</span>student<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span> stus <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>student<span class="token punctuation">{</span> student<span class="token punctuation">{</span>Name<span class="token punctuation">:</span> <span class="token string">"sa"</span><span class="token punctuation">,</span> Age<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span> student<span class="token punctuation">{</span>Name<span class="token punctuation">:</span> <span class="token string">"sb"</span><span class="token punctuation">,</span> Age<span class="token punctuation">:</span> <span class="token number">11</span><span class="token punctuation">}</span><span class="token punctuation">,</span> student<span class="token punctuation">{</span>Name<span class="token punctuation">:</span> <span class="token string">"sc"</span><span class="token punctuation">,</span> Age<span class="token punctuation">:</span> <span class="token number">12</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> log<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"################ 错误做法 ##################"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span> stu <span class="token operator">:=</span> <span class="token keyword">range</span> stus <span class="token punctuation">{</span> m<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">&</span>stu <span class="token punctuation">}</span> <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> s <span class="token operator">:=</span> <span class="token keyword">range</span> m <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>s<span class="token punctuation">.</span>Name<span class="token punctuation">,</span> s<span class="token punctuation">.</span>Age<span class="token punctuation">)</span> <span class="token punctuation">}</span> log<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"################ 正确做法 ##################"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> <span class="token keyword">range</span> stus <span class="token punctuation">{</span> m<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">&</span>stus<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> s <span class="token operator">:=</span> <span class="token keyword">range</span> m <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>s<span class="token punctuation">.</span>Name<span class="token punctuation">,</span> s<span class="token punctuation">.</span>Age<span class="token punctuation">)</span> <span class="token punctuation">}</span> time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h3>输出如下</h3> <pre><code>2018/12/12 12:24:19 ################ 错误做法 ################## 2018/12/12 12:24:19 sc 12 2018/12/12 12:24:19 sc 12 2018/12/12 12:24:19 sc 12 2018/12/12 12:24:19 ################ 正确做法 ################## 2018/12/12 12:24:19 sa 10 2018/12/12 12:24:19 sb 11 2018/12/12 12:24:19 sc 12 </code></pre> <h3>原因</h3>

for k, stu := range stus 变量stu 的地址并不会随着遍历而改变,所以&stu 对应的值始终为stus的最后的元素

<h3>
原文地址</h3>

https://studygolang.com/articles/16878

到此这篇关于“golang 遍历时元素指针问题(转载)”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang遍历时修改被遍历对象
golang for range原理(转载)
Go range实现原理及性能优化剖析
golang实现常用集合原理介绍
数据结构-树和二叉树(Golang)
for-range造就循环永动机?快来看看go中for-range的那些事!
活学活用golang的反射机制
golang key map 所有_Golang面试知识点总结
[Introduction]匿名函数
通过两个例子介绍一下 Golang For Range 循环原理

[关闭]
~ ~