// Created on savesnippets.com ยท https://savesnippets.com/oYzdXy4nJRSexQ package main import "fmt" type Counter struct { count int name string } // Pointer receiver โ€” needed to mutate func (c *Counter) Inc() { c.count++ } // Value receiver โ€” fine when you only read func (c Counter) String() string { return fmt.Sprintf("%s: %d", c.name, c.count) } // Convention: be consistent โ€” if any method needs pointer receiver, // make ALL methods pointer receivers. func main() { c := Counter{name: "visits"} c.Inc() c.Inc() c.Inc() fmt.Println(c) // visits: 3 (uses String()) // Pointer methods can be called on values; Go auto-addresses var p Counter p.Inc() // sugar for (&p).Inc() fmt.Println(p) }