分享
  1. 首页
  2. 文章

for...range的坑

更多精彩内容golang for,range的坑yhao917面试题cosWriterC语言指针朱森2018最全的iOS面试题及答案编程新视野2018最全的iOS面试题及答案zweic · · 1332 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

由于本人是python开发出身,知识浅薄,没有学习过指针、内存之类的知识,如今转为golang,多少都会踩一些指针之类的坑,本章就记录一下自己踩过的相关的坑

当我们用golang写for循环时,一定要注意一个事情,那就是for后面跟的变量每次循环都是同一个指针地址!详情请看代码

package main
import (
 "fmt"
)
func main() {
 sList := []string{"1", "2", "3"}
 for _, v := range sList {
 fmt.Printf("%p \n", &v)
 }
}

输出结果(每次输出的地址都不同,但是三行都是同一个值)

0xc00000e1e0
0xc00000e1e0
0xc00000e1e0

这说明,当Go在运行for循环时,在for语句上所建立的变量(如v),每次都是使用同一个内存地址,当你进行以下的操作时就会出现严重的错误

func pase_student() {
 m := make(map[string]*student)
 stus := []student{
 {Name: "zhou", Age: 24},
 {Name: "li", Age: 23},
 {Name: "wang", Age: 22},
 }
 for _, stu := range stus {
 m[stu.Name] = &stu
 }
 fmt.Println(m)
}

输出

map[zhou:0xc00000a080 li:0xc00000a080 wang:0xc00000a080]

这个map中三个值是指向同一个内存地址的!这显然不是我们想要的,所以如果遇到以上的情况时,需要额外赋值:

func pase_student() {
 m := make(map[string]*student)
 stus := []student{
 {Name: "zhou", Age: 24},
 {Name: "li", Age: 23},
 {Name: "wang", Age: 22},
 }
 for _, stu := range stus {
 st := stu
 m[stu.Name] = &st
 }
 fmt.Println(m)
}

这样就不会出现上面的问题,因为在for循环代码块中所新建的值(如a),随着循环的进行每次都会是不同的内存地址

我们在写代码的时候一定要搞清楚什么时候该用指针,什么时候不该用,否则很容易就会出现我遇到的这种问题

本文主要记录自己在开发过程的所踩的坑,如果理解错误,欢迎评论指正〜


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:更多精彩内容golang for,range的坑yhao917面试题cosWriterC语言指针朱森2018最全的iOS面试题及答案编程新视野2018最全的iOS面试题及答案zweic

查看原文:for...range的坑

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1332 次点击
1 回复 | 直到 2019年11月14日 17:34:21
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏