Hone logo
Hone
Problems

Graceful Channel Closure in Go

Channels are a fundamental part of Go's concurrency model, enabling safe communication between goroutines. Properly closing channels is crucial to signal the end of a stream of data and prevent goroutines from blocking indefinitely. This challenge asks you to implement a function that gracefully closes a channel after sending a specified number of values, demonstrating best practices for channel management.

Problem Description

You are tasked with creating a Go function CloseChannelAfterN that takes a channel of integers (chan int), a number of values to send (n), and a timeout duration (time.Duration) as input. The function should send n integers (0 to n-1) to the channel, then close the channel. If the timeout is reached before n values are sent, the function should close the channel anyway. The function should return a boolean indicating whether all n values were successfully sent before the timeout.

Key Requirements:

  • Send Values: Send integers from 0 to n-1 to the channel.
  • Channel Closure: Close the channel after sending n values or after the timeout.
  • Timeout Handling: Implement a timeout mechanism to ensure the function doesn't block indefinitely if the receiver is not ready.
  • Return Value: Return true if all n values were sent before the timeout, false otherwise.

Expected Behavior:

The function should reliably close the channel, regardless of whether all n values were sent. The timeout mechanism should prevent indefinite blocking. The return value should accurately reflect whether the full sequence of values was transmitted.

Edge Cases to Consider:

  • n is 0: The channel should be closed immediately.
  • The receiver is not reading from the channel: The timeout should trigger channel closure.
  • The channel is already closed: The function should handle this gracefully (e.g., by returning false and not attempting to send).

Examples

Example 1:

Input: ch := make(chan int), n = 3, timeout = 100 * time.Millisecond
Output: true
Explanation: The function sends 0, 1, and 2 to the channel, then closes it.  The receiver is assumed to be ready, so the timeout is not triggered.

Example 2:

Input: ch := make(chan int), n = 3, timeout = 10 * time.Millisecond
Output: false
Explanation: The function attempts to send 0, 1, and 2 to the channel, but the timeout (10ms) is reached before all values are sent. The channel is closed, and the function returns false.

Example 3: (Edge Case)

Input: ch := make(chan int), n = 0, timeout = 100 * time.Millisecond
Output: true
Explanation:  Since n is 0, no values are sent. The channel is closed immediately, and the function returns true (as no values needed to be sent).

Constraints

  • n will be a non-negative integer.
  • timeout will be a positive time.Duration.
  • The channel ch will be a channel of integers (chan int).
  • The function should not panic under any circumstances.
  • The function should be reasonably efficient; avoid unnecessary allocations or complex logic.

Notes

Consider using Go's time.After channel to implement the timeout mechanism. Remember to handle the case where the channel is already closed before your function attempts to send values. Think about how to signal success or failure in a clean and reliable way. Error handling is not explicitly required, but consider how you might handle unexpected errors gracefully.

Loading editor...
go