Smarty
Go Naming ConventionsThe style guide tutorial you never knew you didn't need
Michael Whatcott
Michael Whatcott
 • 
October 18, 2018
Tags

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 know 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 are 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.
rss feed iconSubscribe Now
Read our recent posts
Smarty Launches US GeoReference Data, Providing the Easiest, Most Accurate API Needed To Access Census Tract and Block
Arrow Icon
PROVO, Utah, April 10, 2024 – Smarty, the address data intelligence leader, announces today the launch of US GeoReference Data, a set of updates to Smarty's US Address Enrichment solutions. US GeoReference Data is a cloud-native solution that will allow organizations to append the geographic data found in U. S. Census Block and Tract information into accurately geocoded addresses.  Smarty's US GeoReference Data is the simplest and fastest way for organizations to access Census Blocks, Tracts, location names and statuses, as well as additional Census ID information relevant to a property.
International Be Kind to Lawyers Day
Arrow Icon
Lawyers get a bad rap. Lawyers have been around for a long time, and when you're this old, you're bound to collect your fair share of good and bad. It's true, ask your grandpa. We've got records of people described as "lawyers" going back to ancient Greece, Rome, and the Byzantines. These first individuals were folks who were asked to speak for the accused because those under scrutiny were—understandably so—shaken up by the situation. It went from someone who was your friend and did you a favor by speaking on your behalf to someone who knew all of the laws, and you'd hire them to speak eloquently for you.
Navigating the Future: Geocoding & Address Data Trends in the Cloud
Arrow Icon
In a recent webinar, Berk Charlton, Chief Product Officer at Smarty, provided an in-depth look at our industry-leading address intelligence suite designed to provide highly accurate geocoding and address validation. Here are the main points Berk covered during the session:Comprehensive Product Suite: Smarty offers a wide range of products, including address validation, rooftop geocoding, global address auto-complete, and address data enrichment. These tools are designed to handle various aspects of address management and enhancement in industries from Insurance to Healthcare to Telecom and more.
Ready to get started?