
Golang's timer and ticker are essential tools for scheduling tasks and managing time intervals in your code. A timer allows you to execute a function after a specified duration, while a ticker sends events at regular intervals.
The `time.After` function is a simple way to create a timer, which returns a channel that receives a value after the specified duration. For example, `ch := time.After(5 * time.Second)` creates a channel that receives a value after 5 seconds.
Timers are often used to implement delay or timeout functionality in your code. You can use a timer to wait for a certain amount of time before performing an action, or to cancel an operation if it takes too long.
Golang Timer Basics
In Go, creating a timer is a straightforward process. There are two primary ways to create a timer: using the NewTimer function or the AfterFunc function.
The NewTimer function accepts a time interval, which indicates how long the timer should wait before expiring. This function returns a new Timer, which internally maintains a channel C. When the timer fires, the current time is sent to channel C.
To create a timer using NewTimer, you can specify a time interval in the format of time.Duration. For example, you can create a timer that waits for 5 seconds using the code NewTimer(5 * time.Second).
There are two ways to use a timer: listening to its C property in a new goroutine or specifying a callback function to handle the timer expiration event. The NewTimer function returns a new Timer, which you can use to listen to its C property in a new goroutine.
The AfterFunc function accepts a specified time interval and a callback function. When the timer expires, it directly calls the callback function instead of sending a signal through channel C. Calling the Timer's Stop method can stop the timer and cancel the execution of the callback function.
Here are the two ways to create a timer:
- NewTimer(d Duration)
- AfterFunc(d Duration, f func())
Both functions return a new Timer, which you can use to create a timer and handle its expiration event.
Time and Duration
You can subtract one duration from another using the Sub function, which returns the result as a new duration. This function is useful for calculating the time remaining in a timer.
If the result exceeds the maximum or minimum value that can be stored in a Duration, the maximum or minimum duration will be returned, so be mindful of those limits when working with large time intervals.
Time
A Time in Go represents an instant in time with nanosecond precision.
Programs using times should typically store and pass them as values, not pointers, which means time variables and struct fields should be of type time.Time, not *time.Time.
The zero value of type Time is January 1, year 1, 00:00:00.000000000 UTC, making it unlikely to come up in practice, so the Time.IsZero method is a simple way to detect a time that has not been initialized explicitly.
You can compare Time values using the Before, After, and Equal methods, which are useful for determining the order of time instants.
The Time.Sub method subtracts two instants, producing a Duration, which can be used to calculate the difference between two times.
Time instants can also be added using the Add method, which takes a Time and a Duration as input, producing a new Time.
The Time.GobEncode and Time.MarshalBinary methods store the Time.Location's offset, but not the location name, which means they lose information about Daylight Saving Time.
To compare Time values accurately, you should use the Equal method instead of the == operator, since Equal uses the most accurate comparison available and correctly handles the case when only one of its arguments has a monotonic clock reading.
Duration
A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
You can use the ParseDuration function to parse a duration string into a duration. For example, ParseDuration("300ms") would return a duration of 300 milliseconds.
Curious to learn more? Check out: Golang String Template

The Milliseconds function returns the duration as an integer millisecond count. This is useful if you need to perform calculations or comparisons with durations.
Subtracting one time from another using the Sub function returns the duration between them. However, if the result exceeds the maximum or minimum value that can be stored in a Duration, the maximum or minimum duration will be returned.
You can use the Truncate function to round a time down to a multiple of a given duration. For example, Truncate(Hour) may return a time with a non-zero minute, depending on the time's Location.
The Round function returns the result of rounding a duration to the nearest multiple of another duration. If the result exceeds the maximum or minimum value that can be stored in a Duration, the maximum or minimum duration will be returned.
Time Add
The addtimer function is the entry point for the start of the entire timer, and it simply locks and then calls the addtimerLocked function.
This function is crucial in setting the timer in motion, and it's interesting to note that it's the first step in a series of events that ultimately lead to the timer's completion.
The addtimer function is where it all begins, and its simplicity belies the complexity of the timer's inner workings.
In practical terms, this function is essential for getting the timer started, and it's a vital part of the timer's overall operation.
Explore further: S Golang
Time Nanosecond
Time is a fundamental concept in programming, and understanding how it works can be really helpful.
The Time type in some programming languages has a method called Nanosecond, which returns the nanosecond offset within the second specified by t.
This means you can get a very precise measurement of time, with a range of 0 to 999,999,999 nanoseconds.
You can use this method to create really accurate timing measurements in your code.
Time Second
The second is a fundamental unit of time, and understanding how it works can be really helpful. The Time type in Go has a method called Second that returns the second offset within the minute specified by t, in the range [0, 59].

You can use the Second method to get the current second of the minute. For example, if it's 3:15 PM, the Second method would return 15.
The second is a crucial part of the way we measure time, and it's used in many different applications. Understanding how it works can help you write more accurate and reliable code.
The Second method is a simple way to get the current second of the minute, and it's easy to use in your Go programs.
Ticker and Scheduling
In Go, the Ticker and Timer functions have scheduling limitations that can affect their accuracy. A high runtime load or operating system load can cause the timer's goroutine to respond slowly, leading to untimely triggers.
This can be particularly problematic in environments with limited CPU time allocation, such as container environments restricted by cgroup. The impact can be significant, even for timers with relatively large intervals.
As a result, relying solely on the timing of the timer to ensure program operation can be unreliable.
New Ticker

In Go, you can create a new Ticker object using the NewTicker function. This function accepts a time.Duration parameter d (the interval) and returns a new Ticker object.
The duration d must be greater than zero; if not, NewTicker will panic. Before Go 1.23, the garbage collector did not recover tickers that had not yet expired or been stopped, but as of Go 1.23, the garbage collector can recover unreferenced tickers, even if they haven't been stopped.
You can use the NewTicker function to create a new Ticker object that fires every second, for example. To ensure the timer is cleaned up at the end of the function, you can use defer ticker.Stop().
Here are some key facts about the NewTicker function:
You can also use the Reset method to change the interval of the Ticker object. This method accepts a parameter d of type time.Duration, which represents the new interval. This parameter must be greater than zero; otherwise, the Reset method will panic internally.
Ticker Reset

Resetting a ticker is a straightforward process. The Reset function is added in Go 1.15, which allows you to stop a ticker and reset its period to a specified duration.
To reset a ticker, you must specify a duration that is greater than zero. If the duration is not greater than zero, the Reset function will panic.
The next tick will arrive after the new period elapses.
SuspendableTicker in 0.10.0
SuspendableTicker in 0.10.0 allows you to generate a tick at this point in time with the TickNow function, which may block if nothing consumes the tick.
The TickNow function is a new feature added in version 0.10.0, giving you more control over when a tick occurs. It's a powerful tool that can be used in specific situations where you need to generate a tick immediately.
You can also use the SuspendableTicker's Suspend function to stop sending time events on the channel C, and Resume to re-enable them. This is similar to time.Ticker, but with the added flexibility of being able to suspend and resume the ticker.
Scheduling Goroutine
Scheduling Goroutine can be unpredictable due to high runtime or operating system loads, causing timers to trigger untimely.
In some cases, timers with different intervals may seem to execute concurrently, especially in environments with strict CPU time allocation, like cgroup.
This can lead to unreliable timing, making it unwise to solely rely on timer timing for program operation.
NewTimer's comment emphasizes that the timer will send the current time on its channel after at least the specified duration, but no guarantees are made about on-time execution.
Large time intervals can minimize the impact of this issue.
Monotonic Clocks and Sleep
In Go, you can use a monotonic clock to accurately measure time intervals. This is particularly useful for timing-related tasks.
A monotonic clock is a type of clock that only moves forward and never backward, making it ideal for measuring time intervals that don't rely on the system clock's accuracy.
The `func SleepContext` added in Go 1.9.0 is an example of how to use a monotonic clock for timing-related tasks. It sleeps for the specified time period and returns an error if the context expires early.
Related reading: Golang Go
Monotonic Clocks
Monotonic Clocks are a type of clock that always increases at a constant rate, never going backwards. This is because they are based on a counter that increments at a fixed rate, making them useful for measuring time intervals.
Monotonic Clocks are designed to be more accurate and reliable than traditional clocks, which can be affected by time zone changes or clock adjustments. In fact, they are often used in systems where predictability is crucial, such as in scientific research or financial transactions.
One key advantage of Monotonic Clocks is that they can help prevent certain types of errors, like the "time-of-check to time-of-use" (TOCTTOU) vulnerability, which can occur when a system checks a timestamp and then uses that timestamp without verifying it again. This can be especially problematic in systems where time is critical, such as in banking or healthcare.
Sleep
Sleep is a function that pauses the current goroutine for at least the duration d. A negative or zero duration causes Sleep to return immediately.
On a similar theme: Golang Sleep

The Sleep function is a simple way to introduce pauses in your code, allowing you to control the flow of execution.
SleepContext is a variant of Sleep that takes a context as an argument. If the context expires early, it returns an error.
This is useful when working with deadlines or time-sensitive operations, as it allows you to handle context expiration in a more explicit way.
SleepContext sleeps for the specified time period, which can be a useful feature when building concurrent systems.
Parsing and Formatting
The String method of the Time type returns a formatted string, including a monotonic clock reading if it's available.
This formatted string is meant for debugging purposes and should not be used for a stable serialized representation.
To achieve a stable serialized representation, you can use methods like t.MarshalText, t.MarshalBinary, or t.Format with an explicit format string.
Recommended read: T Golang
Time Iszero
The Time.IsZero method gives a simple way of detecting a time that has not been initialized explicitly. This is useful because the zero value of type Time is January 1, year 1, 00:00:00.000000000 UTC, which is unlikely to come up in practice.

In my experience, it's best to use Time.IsZero instead of checking if the time is equal to January 1, year 1, because the IsZero method is more straightforward and efficient.
The zero value of type Time is January 1, year 1, 00:00:00.000000000 UTC, so if you're not sure if a time has been initialized, you can use Time.IsZero to check.
Parse Duration
Parsing a duration string is a specific process that involves breaking down a string into its component parts, including decimal numbers and unit suffixes.
A duration string can be a possibly signed sequence of decimal numbers, each with an optional fraction and a unit suffix. For example, a duration string could be "300ms" or "-1.5h".
Valid time units in a duration string include "ns", "us" (or "µs"), "ms", "s", "m", and "h".
Controlling and Stopping
You can stop a ticker using the Stop method, which turns off the ticker and prevents any more ticks from being sent. The Stop method does not close the channel, so a concurrent goroutine reading from the channel won't see an erroneous "tick".

A ticker can be reset using the Reset method, which stops the ticker and resets its period to the specified duration. The duration d must be greater than zero; if not, Reset will panic.
You can also stop a timer using the Stop method, which prevents the timer from firing. If the timer has already expired or been stopped, Stop returns false. If the timer is successfully stopped, it returns true.
Here are the key differences between stopping a ticker and a timer:
In summary, stopping a ticker and a timer have different behaviors, but both can be stopped using the Stop method.
Functions
Controlling and Stopping is all about understanding the different functions that come into play.
In the context of brakes, the primary function is to slow or stop the vehicle.
A key factor in controlling speed is the use of gears, which allow drivers to adjust their speed accordingly.
Gear shifting is a crucial function that helps drivers navigate different road conditions and terrains.
In emergency situations, the parking brake function is essential for securing the vehicle and preventing accidents.
Stop

Stopping a timer or ticker is a crucial aspect of controlling its behavior. You can stop a timer or ticker using the Stop method.
The Stop method returns true if the timer or ticker is successfully stopped, and false if it has already expired or been stopped. For example, if you call Stop on a timer that hasn't yet fired, it will return true. If you call Stop on a timer that has already fired or been stopped, it will return false.
The Stop method does not close the channel, which prevents a concurrent goroutine from seeing an erroneous "tick". This is a safety feature to prevent unexpected behavior.
Here are some key points to keep in mind when using the Stop method:
- It returns true if the timer or ticker is successfully stopped, and false if it has already expired or been stopped.
- It does not close the channel.
- It's guaranteed to return true if the timer is running and you haven't received from the channel yet.
- Before Go 1.23, you had to insert an extra receive from the channel if Stop returned false to drain a potential stale value.
In general, it's a good idea to call Stop as soon as you're done with the timer or ticker to prevent it from firing unnecessarily.
Featured Images: pexels.com


