Syntactic Sugar in Go: Simplifying Conditional Logic with cmp.Or

Syntactic Sugar in Go: Simplifying Conditional Logic with cmp.Or
Photo by Daniel Kraus / Unsplash

Go is known for its simplicity and strict adherence to readability, but sometimes that simplicity can require verbose code. In Go, syntactic sugar is rare, yet occasionally, small enhancements can improve readability without sacrificing Go's core principles. One such enhancement is a utility like cmp.Or, which can elegantly eliminate if-else statements in certain scenarios, helping make code shorter and clearer.

In this article, we'll dive into the cmp.Or function, discuss its benefits, use cases, and explore situations where you might consider using it.

What is cmp.Or?

The cmp.Or function, a custom utility function, takes a variable number of arguments and returns the first non-zero (non-default) value among them. For Go developers, this is like a shortcut to replace conditional logic in cases where you'd typically return the first available value that meets a condition.

The Code

Here’s an example implementation of cmp.Or:

package cmp

// Or takes an arbitrary number of values and returns the first non-zero (non-default) value.
func Or[T comparable](values ...T) T {
	var zero T
	for _, v := range values {
		if v != zero {
			return v
		}
	}
	return zero
}

What does this code do? It iterates through a list of values and returns the first non-zero element it encounters. If all values are zero, it returns zero (or the default) of that type. This utility can work with any type that is comparable and has a default value, like numbers, strings, pointers, and structs with comparable fields.

How to Use cmp.Or in Your Code

With cmp.Or, you can skip verbose if-else chains when you're selecting the first valid option. Here’s an example:

package main

import (
	"fmt"
	"cmp"
)

func main() {
	a := 0
	b := 5
	c := 10

	// Using cmp.Or to find the first non-zero value
	result := cmp.Or(a, b, c)
	fmt.Println(result) // Output: 5
}

In this example, cmp.Or returns 5, which is the first non-zero value in the sequence. Without cmp.Or, you’d need to write a series of if checks, making the code more verbose.

💡
Live demo here.

Why Use cmp.Or?

The advantages of using cmp.Or go beyond just saving a few lines of code. Here are some other reasons why it’s worth considering:

  • Improved Readability: Nested if-else blocks can be hard to read, especially when dealing with fallback values. cmp.Or is explicit in its purpose—getting the first valid option.
  • Less Error-Prone: It’s easy to make mistakes in complex conditional chains. cmp.Or centralizes the logic, reducing the chance of a typo or oversight in multiple if statements.
  • More Idiomatic Go Code: Although it may initially look like a non-Go-like approach, cmp.Or aligns with Go’s preference for clear and concise code while maintaining simplicity.

Considerations and Limitations

While cmp.Or is a powerful utility, consider these factors when deciding whether to use it:

  1. Type Compatibility: cmp.Or only works with types that have a meaningful zero value. It won’t work with slices, maps, or interfaces that lack a zero concept in the same way integers or strings do.
  2. Clarity for Non-Go Developers: Go’s explicit nature means that sometimes if-else statements are preferable, especially for developers new to Go. When using cmp.Or, ensure the intention is clear.
  3. Use in Critical Sections: If used inside performance-critical code, be mindful of the function’s overhead. While generally minor, iterating through many arguments can slightly affect performance.
  4. Only for Short Fallback Chains: cmp.Or is best suited for short lists of values. If there are complex or dynamic fallback criteria, it’s better to write explicit conditional logic to avoid confusion.

Other Use Cases and Ideas

cmp.Or is primarily useful for fallback values, but here are a few other scenarios where it can shine:

  • Database Defaults: If you have values from a database query where some fields may be missing, use cmp.Or to set sensible defaults without extra checks.
  • Configuration Management: When managing configurations with optional parameters, cmp.Or allows you to quickly select a parameter’s value or use a default.
  • Environment Variables: When checking environment variables with possible fallbacks, cmp.Or can streamline the code by removing the need for repeated if-else checks.

Finally

cmp.Or provides a clean, readable alternative to if-else chains, allowing Go developers to achieve concise code without sacrificing clarity. While syntactic sugar in Go is rare, this function strikes a nice balance, adding simplicity without straying from Go’s core principles. Whether for handling fallback values, configuring defaults, or improving code readability, cmp.Or is a handy utility worth adding to your toolkit.

In Go, where simplicity is the ultimate sophistication, cmp.Or is a small yet impactful tool that helps developers write clear, maintainable code. Give it a try in your next project, and see how it might simplify your conditional logic!

Support Us

Subscribe to Buka Corner

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
[email protected]
Subscribe