The following program contains a data race
package main import ( "fmt" "time" ) type RPC struct { result int done chan struct{} } func (rpc *RPC) compute() { time.Sleep(time.Second) // strenuous computation intensifies rpc.result = 42 close(rpc.done) } func (RPC) version() int { return 1 // never going to need to change this } func main() { rpc := &RPC{done: make(chan struct{})} go rpc.compute() // kick off computation in the background version := rpc.version() // grab some other information while we're waiting <-rpc.done // wait for computation to finish result := rpc.result fmt.Printf("RPC computation complete, result: %d, version: %d\n", result, version) }
Where is the data race, and what is the smallest change that will fix it ?
Answer: the smallest change I know that will solve the race in this program is to change the receiver of the version
method from RPC
to *RPC
.
Postscript
The example above is derived from a larger, and more confusing example. You may be interested in the original race report.