Collapsing like function parameters

March 31, 2023

Yesterday we learned that we may omit function parameter and result names in a function type definition. But this poses a small limitation:

Function types

… If [the name is] absent, each type stands for one item of that type.

What does that mean, exactly?

Well, when using named parameters and results, we have the option to omit the type for subesquent arguments of the same type. Here’s an example to make it more clear;

func(a int, b int, c int) // Can be shortened to:
func(a, b, c int)

This shortening is not possible with unnamed parameters. Instead, you must specify the type for each argument, as follows:

func(int, int, int)

Of course, there’s still the option to use the blank identifier, if you prefer:

func(_, _, _ int)

Quotes from The Go Programming Language Specification Version of December 15, 2022

Share this

Related Content

Naming function parameters and results

Function types … Within a list of parameters or results, the names (IdentifierList) must either all be present or all be absent. If present, each name stands for one item (parameter or result) of the specified type and all non-blank names in the signature must be unique. There are several things to unpack here. Let’s start with the most intuitive part: The names of function parameters and results must be unique.

Variadic functions

Generally speaking, Go doesn’t allow for the use of optional function parameters. But there is one exception, and that’s where variadic functions come into play. Function types The final incoming parameter in a function signature may have a type prefixed with .... A function with such a parameter is called variadic and may be invoked with zero or more arguments for that parameter. Probably the most ubiquitous example of a variadic function would be fmt.

Unparenthesized results

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.