Go compilers will automatically insert some semicolons in code

Let's view a small program:

package main

func foo() bool {
	return false
}

func main() {
	switch foo()
	{
	case false: println("False")
	case true: println("True")
	}
}

What is the output of the above program? Let's think for a while.

~

~

~

False? No, it prints True. Surprised? Doesn't the function foo always return false?

Yes, the function foo always returns false, but this is unrelated here.

Compilers will automatically insert some semicolons for the above code as:

package main

func foo() bool {
	return false;
};

func main() {
	switch foo();
	{
	case false: println("False");
	case true: println("True");
	};
};

Now, it clearly shows that the switch expression (true) is omitted. The switch block is actually equivalent to:

	switch foo(); true
	{
	case false: println("False");
	case true: println("True");
	};

That is why the program prints True.

About detailed semicolon insertion rules, please read this article.