BREAKING: USPS slashes address verification to 60 addresses/hour. What now?
Smarty

Go naming conventions

Smarty header pin graphic
Updated October 29, 2025
Tags
Smarty header pin graphic

It's been said that naming is one of the two hardest problems in computer science, along with cache invalidation and 'off-by-one' errors. (See what I did there?) Do you ever find yourself wondering what policies and practices you could adopt to make your life easier when reading code you wrote months ago? Or maybe you're up at night wishing you knew how to write code in such a way as to maximize adoption and convenience for your users? Well, look no further because we've anticipated the need, solved the problem, and now we're sharing our knowledge and wisdom at no charge, all out of the goodness of our hearts in this comprehensive, totally no-nonsense (nudge, nudge, wink, wink) style guide of Go naming conventions.

What you’re about to read might actually be helpful at some point, but we're not betting on it. Don't try this at home...actually, do try this at home--but maybe don't try it at work.

Table of contents

  1. Export local variable names
  2. Export local const names
  3. Export input argument names
  4. Export output arguments names
  5. Export reciever names
  6. Use single-character receiver names
  7. Use single-letter argument names
  8. Use double-letter names when you run out of single-letter
  9. Actually, use a generic receiver name like 'this',
  10. For added emphasis, use extended unicode characters for receiver names
  11. Always define import aliases
  12. Always export all imports
  13. Use single-letter (exported) import aliases
  14. In the spirit of #8 (above), use double-letter alias names when necessary

1: Export local variable names

package main

import "fmt"

func main() {
	Message := "Always export local variable names"
	fmt.Println(Message)
}

https://go.dev/play/p/8WVCvJpoa59

2: Export local const names

package main

import "fmt"

func main() {
	const Message = "Always export constants defined in functions"
	fmt.Println(Message)
}

https://go.dev/play/p/-0yZhHVNOOs

3: Export input argument names

package main

import "fmt"

func main() {
	Print("Always export input argument names")
}

func Print(Message string) {
	fmt.Println(Message)
}

https://go.dev/play/p/utRBMOMQNgj

4: Export output arguments names

package main

import "fmt"

func main() {
	Print("Always export output argument names")
}

func Print(Message string) (N int, Err error) {
	return fmt.Println(Message)
}

https://go.dev/play/p/n5cJhLDKNWk

5: Export reciever names

package main

import "fmt"

func main() {
	new(Printer).Print("Always export receiver names")
}

type Printer struct{}

func (Printer *Printer) Print(Message string) (N int, Err error) {
	return fmt.Println(Message)
}

https://go.dev/play/p/jEN-zkrjxdT

6: Use single-character receiver names

package main

import "fmt"

func main() {
	new(Printer).Print(
		"Use only the first letter of a type as the receiver for its methods (oh, wait...), " + 
			"and (per tip #5) make sure the receiver is exported")
}

type Printer struct{}

func (P *Printer) Print(Message string) (N int, Err error) {
	return fmt.Println(Message)
}

https://go.dev/play/p/0OqQLnPPcVd

7: Use single-letter argument names

package main

import "fmt"

func main() {
	new(Printer).Print("Use single-letter variables whenever possible")
}

type Printer struct{}

func (P *Printer) Print(M string) (N int, E error) {
	return fmt.Println(M)
}

https://go.dev/play/p/Q1jgH_6h2kT

8: Use double-letter names when you run out of single-letter names

package main

import "fmt"

func main() {
	new(Printer).Print("Use double-letter variables when you run out of single-letter variables")
}

type Printer struct{}

func (P *Printer) Print(NN string) (N int, E error) {
	return fmt.Println(NN)
}

https://go.dev/play/p/k3p9Hf49-20

9: Actually, use a generic receiver name like 'this', 'self', or 'me'

package main

import "fmt"

func main() {
	new(Printer).Print("On second thought, use a generic receiver name like 'this', 'self', or 'me'.")
}

type Printer struct{}

func (this *Printer) Print(NN string) (N int, E error) {
	return fmt.Println(NN)
}

https://go.dev/play/p/mSMZRqUy4qw

10: For added emphasis, use extended unicode characters for receiver names

package main

import "fmt"

func main() {
	new(Printer).Print("See what I did here? ;)")
}

type Printer struct{}

func (𝕥𝕙𝕚𝕤 *Printer) Print(NN string) (N int, E error) {
	return fmt.Println(NN)
}

https://go.dev/play/p/VPpSDOZYYjT

11: Always define import aliases

package main

import fmt "fmt"

func main() {
	fmt.Println("Always define import aliases")
}

https://go.dev/play/p/zCOnEoNtAf4

12: Always export all imports

package main

import Fmt "fmt"

func main() {
	Fmt.Println("Always export all imports")
}

https://go.dev/play/p/_fEPiypASub

13: Use single-letter (exported) import aliases

package main

import F "fmt"

func main() {
	F.Println("Use single-letter (exported) import aliases")
}

https://go.dev/play/p/e8JQAlSKpnZ

14: In the spirit of #8 (above), use double-letter alias names when necessary

package main

import (
	F "flag"
	FF "fmt"
)

func main() {
	F.Parse()
	FF.Println("Use double-letter alias names when necessary")
}

https://go.dev/play/p/U0ac86PHUsb

Subscribe to our blog!
Learn more about RSS feeds here.
Read our recent posts
Christmas traditions around Smarty
Arrow Icon
Around the world, people celebrate Christmas in all kinds of ways. In Iceland, it’s tradition to read books by candlelight on Christmas Eve. Christmas firework shows are a staple in El Salvador. Families in Australia often spend Christmas Day playing cricket. At Smarty, we keep the season bright with a few traditions of our own. From wacky holiday decorating to gingerbread house competitions, we love taking the holidays to the next level. So stick around; things are about to get festive. Our favorite Christmas traditions are:Seasonal service projectsUpside-down holiday decorUgly Sweater DayThe Great Gingerbread House Bake OffAddy the Address ElfYuletide karaokeLetters to SantaGift-wrapping extravaganzaSeasonal service projectsWe like to celebrate the season of giving by giving back! This year, we participated in United Way's Sub for Santa program, where families—or Smartys 😉—sub in for Santa by donating gifts to local families in need.
Accessibility best practices at Smarty
Arrow Icon
An enterprise-level customer of Smarty’s recently shared how impressed they were with our accessibility-first approach, inquiring about how we designed our tools to function in a way that feels equitable and usable for everyone. At Smarty, one of our core values is outwardness — seeing people as people, not objects or caricatures. Every person who interacts with our tools has their own needs, wants, and objectives, and accessibility is one of the most meaningful ways we connect with people - an area we’re striving to improve.
Introducing Smarty’s mascot… Hermes?
Arrow Icon
Greek gods, as it turns out, have a lot to say to the mortals on Earth and the souls in Hades. What they don’t have is time to travel from Olympus all the way to Earth or Hades just to tell a mere mortal to perform 12 labors… or eat a magical herb… or free Odysseus. That’s why the gods have a personal messenger: Hermes. Equipped with winged sandals, Hermes travels between Olympus, Earth, and the underworld with lightning speed (Get it? Lightning? Because his dad is Zeus? 🤣)Smarty also knows a thing or two about outrageous speed, and that’s not where our similarities with Hermes end.

Ready to get started?