


Concurrency behavior of Go language without buffering channels: Why are there two possibilities for running results?
Apr 02, 2025 am 10:24 AMDetailed explanation of the concurrent behavior and non-blocking characteristics of Go language channels
This article explores the running results of a piece of Go language code when using unbuffered channels and explains the concurrent programming principle behind it. The code utilizes the Go language channel characteristics, but shows different behaviors in different situations, which triggers discussions on issues such as channel blocking and coroutine startup time.
The code is as follows:
package main import "fmt" func main() { chanInt := make(chan int) defer close(chanInt) go func() { for { res, ok := <p> This code creates an unbuffered channel <code>chanInt</code> and starts a goroutine to receive data from the channel and print it. The main goroutine sends 1 and 10 to the channel. However, there are two possibilities for running results: print "1 true" and "10 true", or just print "1 true". This raises the following questions:</p><ol><li> <strong>There are two reasons for the unbuffered channel output:</strong> </li></ol><p> The characteristics of unbuffered channels are: the sending operation is blocked until a goroutine receives data; the receiving operation is also blocked until a goroutine sends data. The main goroutine sends 1 and 10 in turn. Sub-goroutines are received and printed. If the child goroutine receives 1 fast enough, printing "1 true" is completed before the main goroutine sends 10, then receiving 10 and printing "10 true". But if the child goroutine receives 1 slower, the child goroutine may only have time to receive and print 1 before the main goroutine sends 10 and ends. This is because the main goroutine ends causing the channel to be closed, and the child goroutine receives a signal of the channel to be closed ( <code>ok</code> is <code>false</code> ), thus stopping the operation.</p><ol start="2"><li> <strong>Reasons for no output with buffered channels ( <code>chanInt := make(chan int, 2)</code> ):</strong> </li></ol><p> After changing the channel to a buffered channel with capacity 2, the sending operation of the main goroutine will not block because it has enough space to accommodate two values. The main goroutine ends after sending 1 and 10, while the child goroutine may not have started or started receiving data. This is because the coroutine takes time to start. If the main goroutine ends much faster than the child goroutine starts, the child goroutine will not be able to receive data from the closed channel, resulting in no output.</p><p> Through analysis, we understand that in concurrent programming of Go language, coroutine startup time, channel blocking/non-blocking characteristics, and main goroutine end time jointly determine the final output result. The interaction of these factors leads to uncertainty in the outcome. To ensure that the sub-goroutine can handle all sent data, a wait mechanism should be added after the data is sent, such as synchronizing goroutines using <code>WaitGroup</code> .</p>
The above is the detailed content of Concurrency behavior of Go language without buffering channels: Why are there two possibilities for running results?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

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

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

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

As the market conditions pick up, more and more smart investors have begun to quietly increase their positions in the currency circle. Many people are wondering what makes them take decisively when most people wait and see? This article will analyze current trends through on-chain data to help readers understand the logic of smart funds, so as to better grasp the next round of potential wealth growth opportunities.

The pattern in the public chain field shows a trend of "one super, many strong ones, and a hundred flowers blooming". Ethereum is still leading with its ecological moat, while Solana, Avalanche and others are challenging performance. Meanwhile, Polkadot, Cosmos, which focuses on interoperability, and Chainlink, which is a critical infrastructure, form a future picture of multiple chains coexisting. For users and developers, choosing which platform is no longer a single choice, but requires a trade-off between performance, cost, security and ecological maturity based on specific needs.

Recently, Bitcoin hit a new high, Dogecoin ushered in a strong rebound and the market was hot. Next, we will analyze the market drivers and technical aspects to determine whether Ethereum still has opportunities to follow the rise.

Cardano's Alonzo hard fork upgrade has successfully transformed Cardano from a value transfer network to a fully functional smart contract platform by introducing the Plutus smart contract platform. 1. Plutus is based on Haskell language, with powerful functionality, enhanced security and predictable cost model; 2. After the upgrade, dApps deployment is accelerated, the developer community is expanded, and the DeFi and NFT ecosystems are developing rapidly; 3. Looking ahead to 2025, the Cardano ecosystem will be more mature and diverse. Combined with the improvement of scalability in the Basho era, the enhancement of cross-chain interoperability, the evolution of decentralized governance in the Voltaire era, and the promotion of mainstream adoption by enterprise-level applications, Cardano has

Stablecoins are crypto assets that maintain price stability by anchoring fiat currencies such as the US dollar. They are mainly divided into three categories: fiat currency collateral, crypto asset collateral and algorithmic stablecoins. 1. USDT is issued by Tether and is the stablecoin with the largest market value and the highest liquidity. 2. USDC is released by the Centre alliance launched by Circle and Coinbase, and is known for its transparency and compliance. 3. DAI is generated by MakerDAO through over-collateralization of crypto assets and is the core currency in the DeFi field. 4. BUSD was launched in partnership with Paxos, and is regulated by the United States but has been discontinued. 5. TUSD achieves high transparency reserve verification through third-party escrow accounts. Users can use centralized exchanges such as Binance, Ouyi, and Huobi

Yes, some merchants in Yiwu, Zhejiang have indeed begun to accept stablecoins such as USDT as a way to settle trade payments, but this phenomenon is not promoted by official policies and has not been popularized by all merchants. It is mainly a private practice adopted by individual merchants engaged in specific international trade to solve the problem of cross-border payments. 1. The reasons why merchants choose stablecoins include stable value, convenient transactions, low cost and the ability to bypass traditional payment barriers; 2. There are currently no official statistics, and it is estimated that hundreds to thousands of merchants are involved, focusing on industries with high dependence on foreign trade and customers from countries with limited payments; 3. Mainstream trading platforms include Binance, Ouyi, Huobi, Gate.io, KuCoin and Bybit. These platforms provide C2C or P2P transaction services to support fiat currency and stability

The top 20 most promising crypto assets in 2025 include BTC, ETH, SOL, etc., mainly covering multiple tracks such as public chains, Layer 2, AI, DeFi and gaming. 1.BTC continues to lead the market with its digital yellow metallicity and popularization of ETFs; 2.ETH consolidates the ecosystem due to its position and upgrade of smart contract platforms; 3.SOL stands out with high-performance public chains and developer communities; 4.LINK is the leader in oracle connecting real data; 5.RNDR builds decentralized GPU network service AI needs; 6.IMX focuses on Web3 games to provide a zero-gas-free environment; 7.ARB leads with mature Layer 2 technology and huge DeFi ecosystem; 8.MATIC has become the value layer of Ethereum through multi-chain evolution

The core difference between USDC, DAI and TUSD lies in the issuance mechanism, collateral assets and risk characteristics. 1. USDC is a centralized stablecoin issued by Circle and is collateralized by cash and short-term treasury bonds. Its advantages are compliance and transparent, strong liquidity, and high stability, but there is a risk of centralized review and single point failure; 2. DAI is a decentralized stablecoin, generated through the MakerDAO protocol, and the collateral is a crypto asset. It has the advantages of anti-censorship, transparency on chain, and permission-free, but it also faces systemic risks, dependence on centralized assets and complexity issues; 3. TUSD is a centralized stablecoin, emphasizing real-time on-chain reserve proof, providing higher frequency transparency verification, but has a small market share and weak liquidity. The three are collateral types and decentralization
