Related section from the specification: Function Types .
All the other answers here first declare a new type that is good (practice) and makes your code easier to read, but be aware that this is not a requirement.
You can work with function values ββwithout declaring a new type for them, as shown in the example below.
The declaration of a function type variable that has 2 parameters of type float64 and has one return value of type float64 looks like this:
// Create a var of the mentioned function type: var f func(float64, float64) float64
Let him write a function that returns the function of the adder. This adder function should take 2 parameters of type float64 and should return the sum of these two numbers when called:
func CreateAdder() func(float64, float64) float64 { return func(x, y float64) float64 { return x + y } }
Let a function be written that has 3 parameters, the first 2 are of type float64 , and 3 is the value of the function, a function that takes 2 input parameters of type float64 and produces a value of type float64 , And the function we write will call the value of the function that is passed to it as a parameter, and using the first 2 float64 values ββas arguments for the function value and returns the result returned by the passed function value:
func Execute(a, b float64, op func(float64, float64) float64) float64 { return op(a, b) }
See our previous examples in action:
var adder func(float64, float64) float64 = CreateAdder() result := Execute(1.5, 2.5, adder) fmt.Println(result)
Note that when creating adder you can use short variable declarations :
adder := CreateAdder() // adder is of type: func(float64, float64) float64
Try these examples on the Go Playground .
Using an Existing Function
Of course, if you already have a function declared in a package with the same type of function, you can also use this.
For example, math.Mod() has the same type of function:
func Mod(x, y float64) float64
So, you can pass this value to our Execute() function:
fmt.Println(Execute(12, 10, math.Mod))
Seal 2 , because 12 mod 10 = 2 . Note that the name of an existing function acts as the value of the function.
Try it on the go playground .
Note:
Note that parameter names are not part of the type, type 2 functions that have the same parameter and result types are identical regardless of parameter names. But be aware that names must either be present in the list of parameters or results, or not at all.
So, for example, you can also write:
func CreateAdder() func(P float64, Q float64) float64 { return func(x, y float64) float64 { return x + y } }
Or:
var adder func(x1, x2 float64) float64 = CreateAdder()