for...range的坑

作者: 蛋挞先生L | 来源:发表于2019-11-13 17:23 被阅读0次

由于本人是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),随着循环的进行每次都会是不同的内存地址

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

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

相关文章

  • for...range的坑

    由于本人是python开发出身,知识浅薄,没有学习过指针、内存之类的知识,如今转为golang,多少都会踩一些指针...

  • golang之channel用法[转]

    转自 Go Channel 高级实践 用法 超时控制 取最快的结果 限制最大并发数 for...range 优先 ...

  • 指针的操作、go 的规则、for...range

    关于指针的有限操作 传统意义上,指针是一个指向某个确切内存地址的值。这个地址可以是任何数据或者代码的起始地址。 u...

  • 18.Python中的for...range循环

    Python的for循环很灵活,可以实现很多定制的功能。可以使用for循环进行遍历的对象被称为可迭代对象,序列就是...

  • 坑说

    大坑小坑,皆是坑; 深坑浅坑,都能坑; 能不被坑,别被坑; 休要日日想被坑。 关于坑古来有之,最近的就是坑爹,远的...

  • 白童话 | 标题待定

    日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日...

  • 2018-02-08

    坑爹,坑娘。还没见过坑儿子的

  • WebView上传文件无响应的问题:

    坑,坑,坑,坑,坑,坑;注意事项:做完这些可能调用系统相册是没有问题的,但是如果自己写的一个选择图片的页面,我们通...

  • 小马啊小马

    马化腾坑写手,马云坑消费者,马明哲坑全家,马蓉坑老公,马俊仁坑田径,马航坑乘客,马谡坑诸葛亮,马夫人坑乔峰,马伯庸...

  • 汽车坑 | 贷款买车坑不少 你被坑了吗?

    本文转载自公众号“汽车坑”(ID:qichekeng),“汽车坑,大坑小坑,和坑主一起入坑出坑” 今天,坑主有一朋...

网友评论

    本文标题:for...range的坑

    本文链接:https://www.haomeiwen.com/subject/vclkictx.html