Go Fundamentals - Sample
Table of Contents
Chapter 11.4: Uni-Directional Channels
By default channels are bi-directional, meaning you can both send and receive data from the channel.
A common use for uni-directional channels is when you are passing a channel as an argument or receiving a channel as return value. This allows for control of the channel for the function/method and prevents outside callers from polluting the channel.
The standard library does this in the time
package with methods like time.Ticker
, Listing 11.1.
$ go doc time.Ticker
package time // import "time"
type Ticker struct {
C <-chan Time // The channel on which the ticks are delivered.
// Has unexported fields.
}
A Ticker holds a channel that delivers “ticks” of a clock at intervals.
func NewTicker(d Duration) *Ticker
func (t *Ticker) Reset(d Duration)
func (t *Ticker) Stop()
--------------------------------------------------------------------------------
Go Version: go1.23.0
time.Ticker
function.Understanding Uni-Directional Channels
Consider Listing 11.2. The Newspaper
contains a bi-directional channel, headlines chan string
, as a field. It also exposes two methods, TopHeadlines
and ReportStory
.
type Newspaper struct {
headlines chan string
quit chan struct{}
}
// TopHeadlines returns a read-only channel of strings
// that represent the top headlines of the newspaper.
// This channel is consumed by newspaper readers.
func (n Newspaper) TopHeadlines() <-chan string {
return n.headlines
}
// ReportStory returns a write-only channel of strings
// that a reporter can use to report a story.
func (n Newspaper) ReportStory() chan<- string {
return n.headlines
}
Newspaper
type.The TopHeadlines
method returns a read-only version of the headlines
channel that can be consumed by newspaper readers.
The ReportStory
method returns a write-only version of the headlines
channel that can be used by newspaper reporters to report their stories to the newspaper.
In both cases, Go, casts the bi-directional channel, headlines
, to the appropriate uni-directional channel returned by the method.