向Go中的频道馈送Scanner.Bytes()

Please consider this script: https://play.golang.org/p/o4ZhuB3GJ0s (important part below)

It's creating random(ish) strings that look like "foo|foo" (where "foo" is random, but repeated).

I read them with Scanner.Bytes() into an input channel, then 16 worker threads convert them to strings and put them into an output channel.

In the output channel, I split the strings on | to make sure both sides are the same (no data corruption).

Here's the part of the code that scans the input buffer:

// Send input into channel
go func() {
    // Normally os.Stdin
    s := bufio.NewScanner(simulatedStdin)
    start = time.Now()
    for s.Scan() {
        thisLine := s.Bytes()
        line := make([]byte, len(thisLine))
        // Copy the slice so it's not changed on the next iteration
        copy(line, thisLine)
        lines <- line

        // Works, but perhaps the least efficient way to do it
        // lines <- []byte(string(s.Bytes()))
        // lines <- []byte(s.Text())

        // Fails
        // lines <- []byte(s.Bytes())
        // lines <- s.Bytes()[:]
        // lines <- s.Bytes()
    }
    close(lines)
}()

The version above works properly, but if I just do lines <- s.Bytes() (or the other ones I tested), the data gets corrupted because Scanner.Bytes() is always returning the same slice, and I'm passing that slice through the channel, but it's being mutated while the workers are reading it.

My question is, what is the correct/idiomatic way to put Scanner.Bytes() on a channel to prevent this corruption? The way I've posted above works, but it's fairly ugly IMHO, and the string hack is short, but it's really a terrible way to copy data.

Ultimately, I am using this method to read billions of lines of data, so if an extra []byte copy can be removed, I'm all for it. The work being done in the workers is slow (JSON Unmarshaling, etc), but the input scanner is a single thread, so I'm trying to get it to split lines as quickly as possible.