Home  >  Article  >  Backend Development  >  Why doesn't the channel take the last declared value?

Why doesn't the channel take the last declared value?

WBOY
WBOYforward
2024-02-09 09:15:111148browse

Why doesnt the channel take the last declared value?

In PHP, channel (channel) is an important concept used in concurrent programming. It allows communication and synchronization operations between different goroutines. However, a common question is: "Why doesn't the channel take the last declared value?" This question involves the design principles and usage of channels. When the channel is receiving operations, it will block waiting for the sender to send data. When the sender has finished sending the data, the receiver can continue execution. Therefore, the value of a channel is determined when the sender sends data, not when the receiver receives data. This is to ensure the reliability and consistency of communication. Therefore, even if the last declared value has changed when the receiver receives it, the channel will still assume the value when it was sent. Doing so avoids data inconsistencies and confusion and ensures reliability and accuracy of communications.

Question content

I'm trying to understand the channel. In this code, I declare values ​​from 1 to 10. The final declared value is 10, but when I print it, it always returns the value of the two declarations before before(8) . I would be happy if someone could explain it.

func main() {
    channel := make(chan int, 3)
    isOver := make(chan bool)

    go func() {
        for val := range channel {
            fmt.Println(val)
        }
        isOver <- true
    }()

    channel <- 1
    channel <- 2
    channel <- 3
    channel <- 4
    channel <- 5
    channel <- 6
    channel <- 7
    channel <- 8
    channel <- 9
    channel <- 10
    close(channel)

    fmt.Println("Channel Value is: ", <-channel)

    <-isOver

}

When I change the declaration to 8, it returns the value of the two previous declarations, which is 6.

Solution

Because you set 3 buffer sizes for the channel!

NOTE: Your example has different output in different operating systems (e.g. I get the Channel value as: 0)

Set time. Hibernate in your code and see what happens. In your code:

<code>func main() {
    channel := make(chan int)
    isOver := make(chan bool)

    go func() {
        for val := range channel {
            fmt.Println(val)
            // sleep 1 second
            time.Sleep(1 * time.Second)
        }
        isOver <- true
    }()

    channel <- 1
    channel <- 2
    channel <- 3
    channel <- 4
    channel <- 5
    channel <- 6
    channel <- 7
    channel <- 8
    channel <- 9
    channel <- 10
    close(channel)

    fmt.Println("Channel Value is: ", <-channel)
    <-isOver
}

</code>

The output is:

1
2
3
4
5
6
7
Channel Value is:  8
9
10

Note: A better way to understand what is happening in your code is to follow the code step by step.

what happened? See this trace:

1 // print 1 and sleep 1s
2,3,4 // stop for get values

3,4 // print 2 and sleep 1
3,4,5 // stop for get value

4,5 // print 3 and sleep 1
4,5,6 // stop for get value

5,6 // print 4 and sleep 1
5,6,7 // stop for get value

6,7 // print 5 and sleep 1
6,7,8 // stop for get value

7,8 // print 6 and sleep 1
7,8,9 // stop for get value

8,9 // print 7 and sleep 1
8,9,10 // stop for get value
// close channel
// in this line get value : fmt.Println("Channel Value is: ", <-channel)

9,10 // before get value
10 // get 9 and sleep 1
// get 10 and sleep 1

// isdone send signal true

In the tracking code, when the channel gets tree values ​​8,9,10, the channel is closed, in step 2 something happens:

1 - If goroutine gets all values ​​quickly (channel value is: 0)
2 - If the goroutine is busy (channel value is: 7 or 8 or 9 or 10)

See this question for details: When to use buffered channels And check out this website for better understanding: LINK

The above is the detailed content of Why doesn't the channel take the last declared value?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete