Let’s say you’re reading some Go code and stumble upon this:
for _, transaction := range transactions {
customer := customerMap[transaction.Ref]
sendReportEmail(customer.Email)
}
At first glance, it works. But if you’re the poor soul maintaining this code, questions start flooding in:
- What is
customerMap
actually mapping? - What is
transaction.Ref
referring to? Is it a Customer ID? A Card ID? A National ID? - What does that string key even represent?
You’re stuck. You can’t proceed confidently until you understand what customerMap
is mapping from and to.
So, what’s your next move?
If you’re lucky 🍀, you find this somewhere earlier in the code:
customerMap := groupCustomerByCustomerId(customers)
Ah! Now it clicks. customerMap
maps from CustomerID
to Customer
. So transaction.Ref
must be the Customer ID
. You make a mental note and continue reading.
But if you’re not lucky? 😩 You find this instead:
customerMap := buildMapFromCustomers(customers)
Now you have to dive into that function just to figure out one simple thing: what’s the key?
Remember, all you wanted was to tweak the logic slightly. But now you’re deep in unrelated code, just trying to answer a basic question: what does this map do?
🧠 So What’s the Fix?
Name your maps clearly and semantically.
Instead of this:
customerMap := groupCustomerByCustomerId(customers)
Use this:
customerIdToCustomer := groupCustomerByCustomerId(customers)
Now the loop reads beautifully:
for _, transaction := range transactions {
customer := customerIdToCustomer[transaction.Ref]
sendReportEmail(customer.Email)
}
Even without looking elsewhere in the code, you immediately know:
- The key is a
CustomerID
- The value is a
Customer
-
transaction.Ref
is likely a Customer ID
And just like that, you can keep reading without breaking your flow. ✅
🔁 In General: Use keyToValue
Naming for Maps
When naming maps, this format is gold:
keyToValue := make(map[KeyType]ValueType)
Examples:
userIdToEmail
orderIdToStatus
productCodeToPrice
Top comments (0)