尽管我想创建自己的使用goroutine进行练习的管道,但有些特别奇怪。
我使用随机烫发函数生成一些int数,显然是随机的,我将它们写到IO writer,然后从IO reader读取它们,因为它的二进制源,所以我将它们打印出来并进行排序!
这是代码:
func RandomSource(tally int) chan int {
out := make(chan int)
sli := rand.Perm(tally)
fmt.Println(sli)
go func() {
for num := range sli {
out <- num
}
close(out)
}()
return out
}
func ReaderSource(reader io.Reader) chan int {
out := make(chan int)
go func() {
buffer := make([]byte, 8)
for ; ; {
n, err := reader.Read(buffer)
if n > 0 {
v := int(binary.BigEndian.Uint64(buffer))
out <- v
}
if err != nil {
break
}
}
close(out)
}()
return out
}
func WriterSink(writer io.Writer, in chan int) {
for v := range in {
buffer := make([]byte, 8)
binary.BigEndian.PutUint64(
buffer, uint64(v))
writer.Write(buffer)
}
}
func main() {
fileName := "small.in"
file, err := os.Create(fileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
p := RandomSource(500)
WriterSink(file, p)
file, err = os.Open(fileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
p = ReaderSource(file)
for v := range p {
fmt.Println(v)
}
}
最佳答案
range
返回索引作为数组或 slice 的第一个值,该值始终从0到len - 1
。如果要遍历值本身而不是索引集,请使用for _, num := range sli {
。
关于go - slice 自动排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59502588/