GO例程中缓冲通道范围的中断输出

GO例程中缓冲通道范围的中断输出,go,channel,goroutine,Go,Channel,Goroutine,为什么像下面这样的GO例程在使用缓冲通道时以随机顺序输出字节序列 下面是复制错误行为的代码,其中data.csv是一个简单的csv,包含1000行随机数据(大约每行100字节)加上标题行(总共1001行) 另一方面,如果channelLength=0,代码运行平稳,因此对于无缓冲通道(同样是前6行): 数据是随机生成的。来自文档: 底层数组可能指向将被后续扫描调用覆盖的数据 围绕在通道上传递的切片的使用,您有一场数据竞赛。您需要复制正在发送的数据。在本例中,使用字符串而不是[]字节,并从文档中调

为什么像下面这样的GO例程在使用缓冲通道时以随机顺序输出字节序列

下面是复制错误行为的代码,其中
data.csv
是一个简单的csv,包含1000行随机数据(大约每行100字节)加上标题行(总共1001行)

另一方面,如果channelLength=0,代码运行平稳,因此对于无缓冲通道(同样是前6行):

数据是随机生成的。

来自文档:

底层数组可能指向将被后续扫描调用覆盖的数据

围绕在通道上传递的切片的使用,您有一场数据竞赛。您需要复制正在发送的数据。在本例中,使用
字符串
而不是
[]字节
,并从文档中调用

,最容易实现这一点:

底层数组可能指向将被后续扫描调用覆盖的数据


围绕在通道上传递的切片的使用,您有一场数据竞赛。您需要复制正在发送的数据。在本例中,最容易实现这一点的方法是使用
字符串
而不是
[]字节
,然后调用

嘿,JimB,你能解释一下为什么我不能在我的机器上复制它吗?@SamOrozco:这是一场数据竞赛,因此需要精确的时间来获得损坏的输出。不过,即使输出是正确的,竞赛检测器也会显示问题。嘿,吉米,你能解释一下为什么我不能在我的机器上重现这个吗?@SamOrozco:这是一个数据竞赛,所以需要精确的时间来获得损坏的输出。然而,即使输出正确,竞争检测器也会显示问题。
package main

import (
    "bufio"
    "os"
    "time"
)

func main() {

    var channelLength = 10000
    var channel = make(chan []byte, channelLength)

    go func() {
        for c := range channel {
            println(string(c))
        }
    }()

    file, _ := os.Open("./data.csv")
    scanner := bufio.NewScanner(file)

    for scanner.Scan() {
        channel <- scanner.Bytes()
    }

    <-time.After(time.Second * time.Duration(3600))

}
979,C
tharine,Vero,cveror6@blinklist.com,Female,133.153.12.53
980,Mauriz
a,Ilett,milettr7@theguardian.com,Female,226.123.252.118
981
Sher,De Laci,sdelacir8@nps.gov,Female,137.207.30.217
[...]
id,first_name,last_name,email,gender,ip_address
1,Hebert,Edgecumbe,hedgecumbe0@apple.com,Male,108.84.217.38
2,Minor,Lakes,mlakes1@marriott.com,Male,231.185.189.39
3,Faye,Spurdens,fspurdens2@oakley.com,Female,80.173.161.81
4,Kris,Proppers,kproppers3@gmpg.org,Male,10.80.182.51
5,Bronnie,Branchet,bbranchet4@squarespace.com,Male,118.117.0.5
[...]