Home > Article > Backend Development > Should I Use Pointers or Variables with Go\'s WaitGroup\'s Add, Done, and Wait Functions?
Pointer or Variable in WaitGroups Reference
Sync package provides functions such as Add, Done, and Wait to manage wait groups. It's important to understand the correct usage of pointers and variables when working with these functions.
Both Add and Wait functions are called using a pointer to the wait group, as indicated in their function declarations. This is expected behavior since they modify the wait group's internal state.
However, the Done function may seem to be an exception in the following code sample:
var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait()
In this code, the Done function is called using a pointer variable (&wg). This might lead to confusion since it differs from the usage of Add and Wait.
The explanation lies in how variables are passed to functions in Go. When a variable is passed as an argument to a function, a copy of its value is created. In this case, if the Done function were called directly with wg (without the &), the worker function would receive a copy of the wait group. Any changes made within the worker function would not affect the original wait group instance in the main goroutine, which would cause synchronization issues.
Therefore, it's necessary to pass the address of the wait group (&wg) to the Done function so that the worker function has direct access to the original wait group instance and can modify its internal state accordingly.
This also highlights the difference between pointer and value receivers in Go. Receiver functions can be defined as either pointer receivers (*WaitGroup) or value receivers (WaitGroup). Pointer receivers allow the function to modify the underlying value, while value receivers create a copy of the variable, allowing the function to operate on its own copy without affecting the original.
In this particular case, it's necessary to use a pointer receiver for all three functions (Add, Done, Wait) because they all need to modify the wait group's internal state. While Done appears to be an exception, it's actually following the same principle of providing direct access to the original wait group instance.
The above is the detailed content of Should I Use Pointers or Variables with Go\'s WaitGroup\'s Add, Done, and Wait Functions?. For more information, please follow other related articles on the PHP Chinese website!