Why doesn't 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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











Yes, H5 page production is an important implementation method for front-end development, involving core technologies such as HTML, CSS and JavaScript. Developers build dynamic and powerful H5 pages by cleverly combining these technologies, such as using the <canvas> tag to draw graphics or using JavaScript to control interaction behavior.

The method of customizing resize symbols in CSS is unified with background colors. In daily development, we often encounter situations where we need to customize user interface details, such as adjusting...

Regarding the reasons and solutions for misaligned display of inline-block elements. When writing web page layout, we often encounter some seemingly strange display problems. Compare...

How to achieve the 45-degree curve effect of segmenter? In the process of implementing the segmenter, how to make the right border turn into a 45-degree curve when clicking the left button, and the point...

How to use JavaScript or CSS to control the top and end of the page in the browser's printing settings. In the browser's printing settings, there is an option to control whether the display is...

Real-time Bitcoin USD Price Factors that affect Bitcoin price Indicators for predicting future Bitcoin prices Here are some key information about the price of Bitcoin in 2018-2024:

Tips for Implementing Segmenter Effects In user interface design, segmenter is a common navigation element, especially in mobile applications and responsive web pages. ...

Compatibility issues of multi-row overflow on mobile terminal omitted on different devices When developing mobile applications using Vue 2.0, you often encounter the need to overflow text...
