Codewalk: First-Class Functions in Go
Go supports first class functions, higher-order functions, user-defined function types, function literals, closures, and multiple return values.
This rich feature set supports a functional programming style in a strongly typed language.
In this codewalk we will look at a simple program that simulates a dice game called
and evaluates basic strategies.
Pig is a two-player game played with a 6-sided die. Each turn, you may roll or stay.
If you roll a 1, you lose all points for your turn and play passes to your opponent. Any other roll adds its value to your turn score.
If you stay, your turn score is added to your total score, and play passes to your opponent.
The first person to reach 100 total points wins.
type stores the scores of the current and opposing players, in addition to the points accumulated during the current turn.
User-defined function types
In Go, functions can be passed around just like any other value. A function's type signature describes the types of its arguments and return values.
type is a function that takes a
and returns the resulting
and whether the current turn is over.
If the turn is over, the
fields in the resulting
should be swapped, as it is now the other player's turn.
Multiple return values
Go functions can return multiple values.
each return a pair of values. They also match the
type signature. These
functions define the rules of Pig.
A function can use other functions as arguments and return values.
is a function that takes a
as input and returns an
is itself a function.)
Function literals and closures
Anonymous functions can be declared in Go, as in this example. Function literals are closures: they inherit the scope of the function in which they are declared.
One basic strategy in Pig is to continue rolling until you have accumulated at least k points in a turn, and then stay. The argument
is enclosed by this function literal, which matches the
We simulate a game of Pig by calling an
to update the
until one player reaches 100 points. Each
is selected by calling the
function associated with the current player.
Simulating a tournament
function simulates a tournament and tallies wins. Each strategy plays each other strategy
Variadic function declarations
Variadic functions like
take a variable number of arguments. These arguments are available as a slice inside the function.
function defines 100 basic strategies, simulates a round robin tournament, and then prints the win/loss record of each strategy.
Among these strategies, staying at 25 is best, but the
optimal strategy for Pig
is much more complex.