In Go, method receivers determine whether a method acts on a copy of a value or a reference to it. This choice isn’t just about performance—it affects correctness and behavior, especially when dealing with synchronization primitives (mutex, wait group, etc), slices, and embedded types. In this post I explore when to use T (a value receiver) vs. *T (a pointer receiver) and why, in most cases, pointer receivers should be the default and preferred.