# Go's Declaration Syntax
7 Jul 2010
Tags: c, syntax, ethos
Summary: Why Go's declaration syntax doesn't look like, and is much simpler than, C's.

Rob Pike

## Introduction

Newcomers to Go wonder why the declaration syntax is different from the
tradition established in the C family.
In this post we'll compare the two approaches and explain why Go's declarations look as they do.

## C syntax

First, let's talk about C syntax. C took an unusual and clever approach
to declaration syntax.
Instead of describing the types with special syntax,
one writes an expression involving the item being declared,
and states what type that expression will have. Thus

	int x;

declares x to be an int: the expression 'x' will have type int.
In general, to figure out how to write the type of a new variable,
write an expression involving that variable that evaluates to a basic type,
then put the basic type on the left and the expression on the right.

Thus, the declarations

	int *p;
	int a[3];

state that p is a pointer to int because '\*p' has type int,
and that a is an array of ints because a[3] (ignoring the particular index value,
which is punned to be the size of the array) has type int.

What about functions? Originally, C's function declarations wrote the types
of the arguments outside the parens, like this:

	int main(argc, argv)
	    int argc;
	    char *argv[];
	{ /* ... */ }

Again, we see that main is a function because the expression main(argc,
argv) returns an int.
In modern notation we'd write

	int main(int argc, char *argv[]) { /* ... */ }

but the basic structure is the same.

This is a clever syntactic idea that works well for simple types but can get confusing fast.
The famous example is declaring a function pointer.
Follow the rules and you get this:

	int (*fp)(int a, int b);

Here, fp is a pointer to a function because if you write the expression (\*fp)(a,
b) you'll call a function that returns int.
What if one of fp's arguments is itself a function?

	int (*fp)(int (*ff)(int x, int y), int b)

That's starting to get hard to read.

Of course, we can leave out the name of the parameters when we declare a function, so main can be declared

	int main(int, char *[])

Recall that argv is declared like this,

	char *argv[]

so you drop the name from the middle of its declaration to construct its type.
It's not obvious, though, that you declare something of type char \*[] by
putting its name in the middle.

And look what happens to fp's declaration if you don't name the parameters:

	int (*fp)(int (*)(int, int), int)

Not only is it not obvious where to put the name inside

	int (*)(int, int)

it's not exactly clear that it's a function pointer declaration at all.
And what if the return type is a function pointer?

	int (*(*fp)(int (*)(int, int), int))(int, int)

It's hard even to see that this declaration is about fp.

You can construct more elaborate examples but these should illustrate some
of the difficulties that C's declaration syntax can introduce.

There's one more point that needs to be made, though.
Because type and declaration syntax are the same,
it can be difficult to parse expressions with types in the middle.
This is why, for instance, C casts always parenthesize the type, as in

	(int)M_PI

## Go syntax

Languages outside the C family usually use a distinct type syntax in declarations.
Although it's a separate point, the name usually comes first,
often followed by a colon.
Thus our examples above become something like (in a fictional but illustrative language)

	x: int
	p: pointer to int
	a: array[3] of int

These declarations are clear, if verbose - you just read them left to right.
Go takes its cue from here, but in the interests of brevity it drops the
colon and removes some of the keywords:

	x int
	p *int
	a [3]int

There is no direct correspondence between the look of [3]int and how to
use a in an expression.
(We'll come back to pointers in the next section.) You gain clarity at the
cost of a separate syntax.

Now consider functions. Let's transcribe the declaration for main as it would read in Go,
although the real main function in Go takes no arguments:

	func main(argc int, argv []string) int

Superficially that's not much different from C,
other than the change from `char` arrays to strings,
but it reads well from left to right:

function main takes an int and a slice of strings and returns an int.

Drop the parameter names and it's just as clear - they're always first so there's no confusion.

	func main(int, []string) int

One merit of this left-to-right style is how well it works as the types
become more complex.
Here's a declaration of a function variable (analogous to a function pointer in C):

	f func(func(int,int) int, int) int

Or if f returns a function:

	f func(func(int,int) int, int) func(int, int) int

It still reads clearly, from left to right,
and it's always obvious which name is being declared - the name comes first.

The distinction between type and expression syntax makes it easy to write and invoke closures in Go:

	sum := func(a, b int) int { return a+b } (3, 4)

## Pointers

Pointers are the exception that proves the rule.
Notice that in arrays and slices, for instance,
Go's type syntax puts the brackets on the left of the type but the expression
syntax puts them on the right of the expression:

	var a []int
	x = a[1]

For familiarity, Go's pointers use the \* notation from C,
but we could not bring ourselves to make a similar reversal for pointer types.
Thus pointers work like this

	var p *int
	x = *p

We couldn't say

	var p *int
	x = p*

because that postfix \* would conflate with multiplication. We could have used the Pascal ^, for example:

	var p ^int
	x = p^

and perhaps we should have (and chosen another operator for xor),
because the prefix asterisk on both types and expressions complicates things
in a number of ways.
For instance, although one can write

	[]int("hi")

as a conversion, one must parenthesize the type if it starts with a \*:

	(*int)(nil)

Had we been willing to give up \* as pointer syntax, those parentheses would be unnecessary.

So Go's pointer syntax is tied to the familiar C form,
but those ties mean that we cannot break completely from using parentheses
to disambiguate types and expressions in the grammar.

Overall, though, we believe Go's type syntax is easier to understand than C's, especially when things get complicated.

## Notes

Go's declarations read left to right. It's been pointed out that C's read in a spiral!
See [ The "Clockwise/Spiral Rule"](http://c-faq.com/decl/spiral.anderson.html) by David Anderson.
