The Go race detector doesn’t actually find data races; it detects potential data races by observing memory access patterns.

Let’s see it in action. Imagine this simple Go program:

package main

import (
	"fmt"
	"sync"
	"time"
)

var counter int

func main() {
	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		counter++
	}()

	go func() {
		defer wg.Done()
		counter++
	}()

	wg.Wait()
	fmt.Println("Final counter:", counter)
}

This code looks innocent enough. We have a shared counter variable, and two goroutines incrementing it concurrently. We use sync.WaitGroup to ensure both goroutines finish before we print the final value.

If you run this program normally (go run main.go), you’ll likely see Final counter: 2. But if you run it with the race detector enabled:

go run -race main.go

You’ll get output similar to this:

==================
WARNING: DATA RACE DETECTED in

Write at 0x10a675c by goroutine 7:
  main.main.func1()
      /path/to/your/project/main.go:14 +0x39

Previous write at 0x10a675c by goroutine 8:
  main.main.func2()
      /path/to/your/project/main.go:20 +0x39

Goroutine 7 (running)
     0x10a6700 0x10a6758 0x10a678c 0x10a67a4 0x10a67c8 0x10a67e8 0x10a680c 0x10a682c 0x10a684c 0x10a686c 0x10a688c 0x10a68ac 0x10a68c8 0x10a68e8 0x10a6908 0x10a692c 0x10a694c 0x10a696c 0x10a698c 0x10a69a8 0x10a69c8 0x10a69e8 0x10a6a08 0x10a6a28 0x10a6a48 0x10a6a68 0x10a6a88 0x10a6aa8 0x10a6ac8 0x10a6ae8 0x10a6b08 0x10a6b28 0x10a6b48 0x10a6b68 0x10a6b88 0x10a6ba8 0x10a6bc8 0x10a6be8 0x10a6c08 0x10a6c28 0x10a6c48 0x10a6c68 0x10a6c88 0x10a6ca8 0x10a6cc8 0x10a6ce8 0x10a6d08 0x10a6d28 0x10a6d48 0x10a6d68 0x10a6d88 0x10a6da8 0x10a6dc8 0x10a6de8 0x10a6e08 0x10a6e28 0x10a6e48 0x10a6e68 0x10a6e88 0x10a6ea8 0x10a6ec8 0x10a6ee8 0x10a6f08 0x10a6f28 0x10a6f48 0x10a6f68 0x10a6f88 0x10a6fa8 0x10a6fc8 0x10a6fe8 0x10a7008 0x10a7028 0x10a7048 0x10a7068 0x10a7088 0x10a70a8 0x10a70c8 0x10a70e8 0x10a7108 0x10a7128 0x10a7148 0x10a7168 0x10a7188 0x10a71a8 0x10a71c8 0x10a71e8 0x10a7208 0x10a7228 0x10a7248 0x10a7268 0x10a7288 0x10a72a8 0x10a72c8 0x10a72e8 0x10a7308 0x10a7328 0x10a7348 0x10a7368 0x10a7388 0x10a73a8 0x10a73c8 0x10a73e8 0x10a7408 0x10a7428 0x10a7448 0x10a7468 0x10a7488 0x10a74a8 0x10a74c8 0x10a74e8 0x10a7508 0x10a7528 0x10a7548 0x10a7568 0x10a7588 0x10a75a8 0x10a75c8 0x10a75e8 0x10a7608 0x10a7628 0x10a7648 0x10a7668 0x10a7688 0x10a76a8 0x10a76c8 0x10a76e8 0x10a7708 0x10a7728 0x10a7748 0x10a7768 0x10a7788 0x10a77a8 0x10a77c8 0x10a77e8 0x10a7808 0x10a7828 0x10a7848 0x10a7868 0x10a7888 0x10a78a8 0x10a78c8 0x10a78e8 0x10a7908 0x10a7928 0x10a7948 0x10a7968 0x10a7988 0x10a79a8 0x10a79c8 0x10a79e8 0x10a7a08 0x10a7a28 0x10a7a48 0x10a7a68 0x10a7a88 0x10a7aa8 0x10a7ac8 0x10a7ae8 0x10a7b08 0x10a7b28 0x10a7b48 0x10a7b68 0x10a7b88 0x10a7ba8 0x10a7bc8 0x10a7be8 0x10a7c08 0x10a7c28 0x10a7c48 0x10a7c68 0x10a7c88 0x10a7ca8 0x10a7cc8 0x10a7ce8 0x10a7d08 0x10a7d28 0x10a7d48 0x10a7d68 0x10a7d88 0x10a7da8 0x10a7dc8 0x10a7de8 0x10a7e08 0x10a7e28 0x10a7e48 0x10a7e68 0x10a7e88 0x10a7ea8 0x10a7ec8 0x10a7ee8 0x10a7f08 0x10a7f28 0x10a7f48 0x10a7f68 0x10a7f88 0x10a7fa8 0x10a7fc8 0x10a7fe8 0x10a8008 0x10a8028 0x10a8048 0x10a8068 0x10a8088 0x10a80a8 0x10a80c8 0x10a80e8 0x10a8108 0x10a8128 0x10a8148 0x10a8168 0x10a8188 0x10a81a8 0x10a81c8 0x10a81e8 0x10a8208 0x10a8228 0x10a8248 0x10a8268 0x10a8288 0x10a82a8 0x10a82c8 0x10a82e8 0x10a8308 0x10a8328 0x10a8348 0x10a8368 0x10a8388 0x10a83a8 0x10a83c8 0x10a83e8 0x10a8408 0x10a8428 0x10a8448 0x10a8468 0x10a8488 0x10a84a8 0x10a84c8 0x10a84e8 0x10a8508 0x10a8528 0x10a8548 0x10a8568 0x10a8588 0x10a85a8 0x10a85c8 0x10a85e8 0x10a8608 0x10a8628 0x10a8648 0x10a8668 0x10a8688 0x10a86a8 0x10a86c8 0x10a86e8 0x10a8708 0x10a8728 0x10a8748 0x10a8768 0x10a8788 0x10a87a8 0x10a87c8 0x10a87e8 0x10a8808 0x10a8828 0x10a8848 0x10a8868 0x10a8888 0x10a88a8 0x10a88c8 0x10a88e8 0x10a8908 0x10a8928 0x10a8948 0x10a8968 0x10a8988 0x10a89a8 0x10a89c8 0x10a89e8 0x10a8a08 0x10a8a28 0x10a8a48 0x10a8a68 0x10a8a88 0x10a8aa8 0x10a8ac8 0x10a8ae8 0x10a8b08 0x10a8b28 0x10a8b48 0x10a8b68 0x10a8b88 0x10a8ba8 0x10a8bc8 0x10a8be8 0x10a8c08 0x10a8c28 0x10a8c48 0x10a8c68 0x10a8c88 0x10a8ca8 0x10a8cc8 0x10a8ce8 0x10a8d08 0x10a8d28 0x10a8d48 0x10a8d68 0x10a8d88 0x10a8da8 0x10a8dc8 0x10a8de8 0x10a8e08 0x10a8e28 0x10a8e48 0x10a8e68 0x10a8e88 0x10a8ea8 0x10a8ec8 0x10a8ee8 0x10a8f08 0x10a8f28 0x10a8f48 0x10a8f68 0x10a8f88 0x10a8fa8 0x10a8fc8 0x10a8fe8 0x10a9008 0x10a9028 0x10a9048 0x10a9068 0x10a9088 0x10a90a8 0x10a90c8 0x10a90e8 0x10a9108 0x10a9128 0x10a9148 0x10a9168 0x10a9188 0x10a91a8 0x10a91c8 0x10a91e8 0x10a9208 0x10a9228 0x10a9248 0x10a9268 0x10a9288 0x10a92a8 0x10a92c8 0x10a92e8 0x10a9308 0x10a9328 0x10a9348 0x10a9368 0x10a9388 0x10a93a8 0x10a93c8 0x10a93e8 0x10a9408 0x10a9428 0x10a9448 0x10a9468 0x10a9488 0x10a94a8 0x10a94c8 0x10a94e8 0x10a9508 0x10a9528 0x10a9548 0x10a9568 0x10a9588 0x10a95a8 0x10a95c8 0x10a95e8 0x10a9608 0x10a9628 0x10a9648 0x10a9668 0x10a9688 0x10a96a8 0x10a96c8 0x10a96e8 0x10a9708 0x10a9728 0x10a9748 0x10a9768 0x10a9788 0x10a97a8 0x10a97c8 0x10a97e8 0x10a9808 0x10a9828 0x10a9848 0x10a9868 0x10a9888 0x10a98a8 0x10a98c8 0x10a98e8 0x10a9908 0x10a9928 0x10a9948 0x10a9968 0x10a9988 0x10a99a8 0x10a99c8 0x10a99e8 0x10a9a08 0x10a9a28 0x10a9a48 0x10a9a68 0x10a9a88 0x10a9aa8 0x10a9ac8 0x10a9ae8 0x10a9b08 0x10a9b28 0x10a9b48 0x10a9b68 0x10a9b88 0x10a9ba8 0x10a9bc8 0x10a9be8 0x10a9c08 0x10a9c28 0x10a9c48 0x10a9c68 0x10a9c88 0x10a9ca8 0x10a9cc8 0x10a9ce8 0x10a9d08 0x10a9d28 0x10a9d48 0x10a9d68 0x10a9d88 0x10a9da8 0x10a9dc8 0x10a9de8 0x10a9e08 0x10a9e28 0x10a9e48 0x10a9e68 0x10a9e88 0x10a9ea8 0x10a9ec8 0x10a9ee8 0x10a9f08 0x10a9f28 0x10a9f48 0x10a9f68 0x10a9f88 0x10a9fa8 0x10a9fc8 0x10a9fe8 0x10aa008 0x10aa028 0x10aa048 0x10aa068 0x10aa088 0x10aa0a8 0x10aa0c8 0x10aa0e8 0x10aa108 0x10aa128 0x10aa148 0x10aa168 0x10aa188 0x10aa1a8 0x10aa1c8 0x10aa1e8 0x10aa208 0x10aa228 0x10aa248 0x10aa268 0x10aa288 0x10aa2a8 0x10aa2c8 0x10aa2e8 0x10aa308 0x10aa328 0x10aa348 0x10aa368 0x10aa388 0x10aa3a8 0x10aa3c8 0x10aa3e8 0x10aa408 0x10aa428 0x10aa448 0x10aa468 0x10aa488 0x10aa4a8 0x10aa4c8 0x10aa4e8 0x10aa508 0x10aa528 0x10aa548 0x10aa568 0x10aa588 0x10aa5a8 0x10aa5c8 0x10aa5e8 0x10aa608 0x10aa628 0x10aa648 0x10aa668 0x10aa688 0x10aa6a8 0x10aa6c8 0x10aa6e8 0x10aa708 0x10aa728 0x10aa748 0x10aa768 0x10aa788 0x10aa7a8 0x10aa7c8 0x10aa7e8 0x10aa808 0x10aa828 0x10aa848 0x10aa868 0x10aa888 0x10aa8a8 0x10aa8c8 0x10aa8e8 0x10aa908 0x10aa928 0x10aa948 0x10aa968 0x10aa988 0x10aa9a8 0x10aa9c8 0x10aa9e8 0x10aaa08 0x10aaa28 0x10aaa48 0x10aaa68 0x10aaa88 0x10aaaa8 0x10aaac8 0x10aaae8 0x10aab08 0x10aab28 0x10aab48 0x10aab68 0x10aab88 0x10aaba8 0x10aabc8 0x10aabe8 0x10aac08 0x10aac28 0x10aac48 0x10aac68 0x10aac88 0x10aaca8 0x10aaccc8 0x10aace8 0x10aad08 0x10aad28 0x10aad48 0x10aad68 0x10aad88 0x10aada8 0x10aadc8 0x10aade8 0x10aae08 0x10aae28 0x10aae48 0x10aae68 0x10aae88 0x10aaea8 0x10aaee8 0x10aaf08 0x10aaf28 0x10aaf48 0x10aaf68 0x10aaf88 0x10aafa8 0x10aafc8 0x10aafd8 0x10ab008 0x10ab028 0x10ab048 0x10ab068 0x10ab088 0x10ab0a8 0x10ab0c8 0x10ab0e8 0x10ab108 0x10ab128 0x10ab148 0x10ab168 0x10ab188 0x10ab1a8 0x10ab1c8 0x10ab1e8 0x10ab208 0x10ab228 0x10ab248 0x10ab268 0x10ab288 0x10ab2a8 0x10ab2c8 0x10ab2e8 0x10ab308 0x10ab328 0x10ab348 0x10ab368 0x10ab388 0x10ab3a8 0x10ab3c8 0x10ab3e8 0x10ab408 0x10ab428 0x10ab448 0x10ab468 0x10ab488 0x10ab4a8 0x10ab4c8 0x10ab4e8 0x10ab508 0x10ab528 0x10ab548 0x10ab568 0x10ab588 0x10ab5a8 0x10ab5c8 0x10ab5e8 0x10ab608 0x10ab628 0x10ab648 0x10ab668 0x10ab688 0x10ab6a8 0x10ab6c8 0x10ab6e8 0x10ab708 0x10ab728 0x10ab748 0x10ab768 0x10ab788 0x10ab7a8 0x10ab7c8 0x10ab7e8 0x10ab808 0x10ab828 0x10ab848 0x10ab868 0x10ab888 0x10ab8a8 0x10ab8c8 0x10ab8e8 0x10ab908 0x10ab928 0x10ab948 0x10ab968 0x10ab988 0x10ab9a8 0x10ab9c8 0x10ab9e8 0x10aba08 0x10aba28 0x10aba48 0x10aba68 0x10aba88 0x10abaa8 0x10abac8 0x10abae8 0x10abb08 0x10abb28 0x10abb48 0x10abb68 0x10abb88 0x10abba8 0x10abbc8 0x10abbee8 0x10abc08 0x10abc28 0x10abc48 0x10abc68 0x10abc88 0x10abcca8 0x10abcce8 0x10abcd8 0x10abcdc8 0x10abcde8 0x10abce8 0x10abcf8 0x10abd08 0x10abd18 0x10abd28 0x10abd38 0x10abd48 0x10abd58 0x10abd68 0x10abd78 0x10abd88 0x10abd98 0x10abda8 0x10abdb8 0x10abdc8 0x10abdd8 0x10abde8 0x10abdf8 0x10abe08 0x10abe18 0x10abe28 0x10abe38 0x10abe48 0x10abe58 0x10abe68 0x10abe78 0x10abe88 0x10abe98 0x10abea8 0x10abeb8 0x10abec8 0x10abed8 0x10abee8 0x10abef8 0x10abf08 0x10abf18 0x10abf28 0x10abf38 0x10abf48 0x10abf58 0x10abf68 0x10abf78 0x10abf88 0x10abf98 0x10abfa8 0x10abfb8 0x10abfc8 0x10abfd8 0x10abfe8 0x10abff8 0x10ac008 0x10ac018 0x10ac028 0x10ac038 0x10ac048 0x10ac058 0x10ac068 0x10ac078 0x10ac088 0x10ac098 0x10ac0a8 0x10ac0b8 0x10ac0c8 0x10ac0d8 0x10ac0e8 0x10ac0f8 0x10ac108 0x10ac118 0x10ac128 0x10ac138 0x10ac148 0x10ac158 0x10ac168 0x10ac178 0x10ac188 0x10ac198 0x10ac1a8 0x10ac1b8 0x10ac1c8 0x10ac1d8 0x10ac1e8 0x10ac1f8 0x10ac208 0x10ac218 0x10ac228 0x10ac238 0x10ac248 0x10ac258 0x10ac268 0x10ac278 0x10ac288 0x10ac298 0x10ac2a8 0x10ac2b8 0x10ac2c8 0x10ac2d8 0x10ac2e8 0x10ac2f8 0x10ac308 0x10ac318 0x10ac328 0x10ac338 0x10ac348 0x10ac358 0x10ac368 0x10ac378 0x10ac388 0x10ac398 0x10ac3a8 0x10ac3b8 0x10ac3c8 0x10ac3d8 0x10ac3e8 0x10ac3f8 0x10ac408 0x10ac418 0x10ac428 0x10ac438 0x10ac448 0x10ac458 0x10ac468 0x10ac478 0x10ac488 0x10ac498 0x10ac4a8 0x10ac4b8 0x10ac4c8 0x10ac4d8 0x10ac4e8 0x10ac4f8 0x10ac508 0x10ac518 0x10ac528 0x10ac538 0x10ac548 0x10ac558 0x10ac568 0x10ac578 0x10ac588 0x10ac598 0x10ac5a8 0x10ac5b8 0x10ac5c8 0x10ac5d8 0x10ac5e8 0x10ac5f8 0x10ac608 0x10ac618 0x10ac628 0x10ac638 0x

Want structured learning?

Take the full Golang course →