func tmpfileReadWriter(ch fileChannels) { tmpFile, err := ioutil.TempFile(".", "product") if err != nil { log.Panic(err) } length := make([]byte, 8) var writeCount uint64 for inData := range ch.writeChan { buf := inData.Bytes() encodeLength(length, len(buf)) if _, err := tmpFile.Write(length); err != nil { log.Panic(err) } if _, err := tmpFile.Write(buf); err != nil { log.Panic(err) } inData.Clear() writeCount += 1 } if newOffset, e := tmpFile.Seek(0, 0); e != nil || newOffset != 0 { log.Panic(e) } var readCount uint64 m := new(gmp.Int) for { if _, e := io.ReadFull(tmpFile, length); e != nil { if e == io.EOF { break } log.Panic(e) } buf := make([]byte, decodeLength(length)) if _, e := io.ReadFull(tmpFile, buf); e != nil { log.Panic(e) } readCount += 1 ch.readChan <- m.SetBytes(buf) m = new(gmp.Int) } if writeCount != readCount { log.Panicf("Didn't write as many as we read: write=%v read=%v", writeCount, readCount) } close(ch.readChan) syscall.Unlink(tmpFile.Name()) // tmpFile.Truncate(0); }