猿问

Golang 中的频道

我正在尝试实现一个函数,该函数使用通道向另一个发送不确定数量的变量(float64 类型)。


第二个函数将接收并按照接收顺序创建一个切片。


这是为我已经开发的系统添加更多功能的练习。这就是为什么以这种方式说明代码的原因。


当缓冲区为1时,程序进入死锁。如果我将它增加到 7(= 切片长度),程序运行错误并且不会停止。


我理解缓冲区应该等于0或不大于1,以确保不丢失数据和顺序。


https://play.golang.org/p/rnLH51GinsG


我希望你能帮助我。


package main


import (

    "fmt"

    "sync"

)


var waitgroup sync.WaitGroup


/* This function simulates another that sends an

undetermined amount of float64.*/

func sendFloat64() <-chan float64 {

    channel := make(chan float64, 7) // Buffer = 1 to ensure receipt of the first data before sending the second

    defer close(channel)


    originalSlice := []float64{90, 180, 270, 300, 330, 358, 359} // It represents an undetermined number of values.


    for _, v := range originalSlice {

        channel <- v // one value at a time to keep order

        fmt.Println("SendFloat64: send data to channel", v)

    }

    return channel

}


/* This function receives the values and then it will be

incorporated in a slice respecting the order in which they were sent.*/

func RecreateSlice() <-chan []float64 {


    waitgroup.Add(1)

    defer waitgroup.Done()


    channelOut := make(chan []float64)

    defer close(channelOut)


    var slice []float64


    for {

        dataRecived, ok := <-sendFloat64()

        if !ok {

            break

        }

        fmt.Println("RecreateSlice: Data received from channel", dataRecived)


        slice = append(slice, dataRecived)


    }


    channelOut <- slice


    return channelOut

}


慕沐林林
浏览 128回答 1
1回答

海绵宝宝撒

如果我正确理解你的问题,我认为这段代码更好。它也确实保证了订单。package mainimport (&nbsp; &nbsp; "fmt")// sendFloat64 simulates another that sends an// undetermined amount of float64.func sendFloat64(ch chan<- float64) {&nbsp; &nbsp; originalSlice := []float64{90, 180, 270, 300, 330, 358, 359}&nbsp; &nbsp; for _, v := range originalSlice {&nbsp; &nbsp; &nbsp; &nbsp; // send the data in order as soon as possible to the reciver&nbsp; &nbsp; &nbsp; &nbsp; ch <- v&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("SendFloat64: send data to channel", v)&nbsp; &nbsp; }&nbsp; &nbsp; close(ch)}// RecreateSlice receives the values and then it will be// incorporated in a slice respecting the order in which they were sent.func RecreateSlice() []float64 {&nbsp; &nbsp; var stream []float64&nbsp; &nbsp; // Create a float64 channel with a buffer of 1&nbsp; &nbsp; channel := make(chan float64, 1)&nbsp; &nbsp; go sendFloat64(channel)&nbsp; &nbsp; // Append data until the channel is closed&nbsp; &nbsp; for data := range channel {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("RecreateSlice: Data received from channel", data)&nbsp; &nbsp; &nbsp; &nbsp; stream = append(stream, data)&nbsp; &nbsp; }&nbsp; &nbsp; return stream}func main() {&nbsp; &nbsp; result := RecreateSlice()&nbsp; &nbsp; fmt.Println("MainSlice: ", result)}输出:RecreateSlice: Data received from channel 90SendFloat64: send data to channel 90SendFloat64: send data to channel 180SendFloat64: send data to channel 270RecreateSlice: Data received from channel 180RecreateSlice: Data received from channel 270RecreateSlice: Data received from channel 300SendFloat64: send data to channel 300SendFloat64: send data to channel 330SendFloat64: send data to channel 358RecreateSlice: Data received from channel 330RecreateSlice: Data received from channel 358RecreateSlice: Data received from channel 359SendFloat64: send data to channel 359MainSlice:&nbsp; [90 180 270 300 330 358 359]注意 SendFloat64 的顺序:90, 180, 270, 300, 330, 358, 359注意 RecreateSlice 的顺序:90, 180, 270, 300, 330, 358, 359并且 RecreateSlice 返回的切片是有序的(验证)您可以根据此代码的想法扩展您的解决方案。我试图对部分代码进行注释,以便您理解。
随时随地看视频慕课网APP

相关分类

Go
我要回答