美文网首页GolangGolang 入门资料+笔记
Golang中range指针数据的坑

Golang中range指针数据的坑

作者: Peven | 来源:发表于2019-02-01 17:38 被阅读2次

在Golang中使用for range语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。

下面的代码中定义了一个元素类型为*int的通道ch

package main

import (
    "fmt"
)

func main() {
    ch := make(chan *int, 5)
    
    //sender
    input := []int{1,2,3,4,5}
    
    go func(){
        for _, v := range input {
            ch <- &v
        }
        close(ch)
    }()
    //receiver
    for v := range ch {
        fmt.Println(*v)
    }
}

在上面代码中,发送方将input数组发送给ch通道,接收方再从ch通道中接收数据,程序的预期输出应该是:

1
2
3
4
5

现在运行一下程序,得到的输出如下:

5
5
5
5
5

很明显,程序并没有达到预期的结果,那么问题出在哪里呢?我们将代码稍作修改:

//receiver
    for v := range ch {
        fmt.Println(v)
    }

得到如下输出:

0x416020
0x416020
0x416020
0x416020
0x416020

可以看到,5次输出变量v*int)都指向了同一个地址,返回去检查一下发送部分代码:

for _, v := range input {
    ch <- &v
}

问题正是出在这里,在for range语句中,v变量用于保存迭代input数组所得的值,但是v只被声明了一次,此后都是将迭代input出的值赋值给vv变量的内存地址始终未变,这样再将v的地址发送给ch通道,发送的都是同一个地址,当然无法达到预期效果。

解决方案是,引入一个中间变量,每次迭代都重新声明一个变量temp,赋值后再将其地址发送给ch

for _, v := range input {
    temp := v
    ch <- &temp
}

抑或直接引用数据的内存(推荐,无需开辟新的内存空间):

for k, _ := range input {
    c <- &input[k]
}

再次运行,就可看到预期的效果。以上方案是用于讨论range语句带来的问题,当然,平时还是尽量避免使用指针类型的通道。

相关文章

  • Golang中range指针数据的坑

    在Golang中使用for range语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。 下面的代码中定义了...

  • [golang] for ... range指针的坑

    话不多说,看代码知道输出结果么? 输出结果 for range每次循环使用的是同一个临时变量!每次都是做了一次值拷...

  • golang for,range的坑

    for,range 的k,v变量在整个遍历过程中共用,不能直接进行引用传递,即地址传递,但循环内定义的变量只能为当...

  • Go 学习

    go语言局部变量分配在栈还是堆Golang 垃圾回收剖析go语言坑之for range

  • golang 新手容易遇到的坑

    Golang Range关键字的秘密

  • Golang 中的指针

    指针的定义 A pointer is a value that points to the memory addr...

  • Learn Golang in Days - Day 11

    Learn Golang in Days - Day 11 要点 Range Go语言中range关键字用于for...

  • Golang range 的一些坑

    先举个栗子: 我们期望的结果是 但是实际输出的结果是 为什么没有改变? 其实 for range 中的 v 是一个...

  • 深入理解Golang Slice

    深入理解Golang Slice 数据结构 slice的底层数据结构中的array是一个指针,指向的是一个Arra...

  • Golang基础(三)——复杂类型

    Golang基础(三)——复杂类型 @([07] golang)[Go总结] [TOC] 指针 定义 指针变量可以...

网友评论

    本文标题:Golang中range指针数据的坑

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