Unparenthesized results
April 3, 2023
Function types
…
Parameter and result lists are always parenthesized except that if there is exactly one unnamed result it may be written as an unparenthesized type.
But more directly: Function parameters must always be wrapped in parenthesis. Function reults must be wrapped in parenthesis if there is more than one result, or if the result is named. Further, though not clear from this wording in the spec, if there are no results, no parenthesis are required, even though if there are no parameters, they are still required.
Let’s look at examples.
func() // No parameters, and no results. The (empty) parameter list must still be parenthesized.
func() error // A single, un-named result requires no parentheses.
func() (err error) // Parentheses required because the result is named
func() (int, error) // Parentheses required because of multiple return values
There may be a few times when you don’t see parentheses that could surprise you, because they appear to violate this rule because they contain multiple words. But keep in mind that some some types are expressed using multiple words.
// This function returns a value of type `func() error`
func () func() error
// This function returns a value of type `chan bool`
func() chan bool
Quotes from The Go Programming Language Specification Version of December 15, 2022