This is a created article in which the information may have evolved or changed.
How do I move a calculation between goroutine? That is, how to Goroutine G1 in the calculation "move" to Goroutine G2 to execute?
The scenario is this, there are some goroutine shared data, only one goroutine have the Write permission of the data, the other goroutine only Read permission (if more than one goroutine at the same time write permission on the data must be locked). At this point, a goroutine G1 holds a reference to data D, but does not have the write permission of the data, and the other Goroutine G2 has the Write permission of the data, hoping that the calculation of D, from G1 "move" to G2 to execute.
The basic idea is to encapsulate the function with the data, wrap it in the inner side of the closure, and then pass it through the channel, passing from one goroutine to another goroutine to execute.
On the code:
// shared datavar data Dfunc computation(d *D) {}go G1() { // d is an reference to shared data D d := &data // a closure send to channel ch <- func() { computation(d) }}go G2() { // get the closure from channel f := <- ch // execute the computation f()}