func outer() (func() int, int) { outer_var := 2 inner := func() int { outer_var += 99 return outer_var } inner() return inner, outer_var } inner, val := outer() fmt.Println(inner()) // => 200 fmt.Println(val) // => 101
Go Functions
Closures 2
Closures 1
func scope() func() int{ outer_var := 2 foo := func() int {return outer_var} return foo } // Outpus: 2 fmt.Println(scope()())
Functions as values
func main() { // assign a function to a name add := func(a, b int) int { return a + b } // use the name to call the function fmt.Println(add(3, 4)) // => 7 }
init function
import --> const --> var --> init()
var num = setNumber() func setNumber() int { return 42 } func init() { num = 0 } func main() { fmt.Println(num) // => 0 }
Variadic functions
func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums { total += num } fmt.Println(total) } sum(1, 2) //=> [1 2] 3 sum(1, 2, 3) // => [1 2 3] 6 nums := []int{1, 2, 3, 4} sum(nums...) // => [1 2 3 4] 10
Naked returns
func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return } x, y := split(17) fmt.Println(x) // => 7 fmt.Println(y) // => 10
Note that using naked returns hurts readability.
Function literals
r1, r2 := func() (string, string) { x := []string{"hello", "quickref.me"} return x[0], x[1] }() // => hello quickref.me fmt.Println(r1, r2)
Multiple return
func vals() (int, int) { return 3, 7 } a, b := vals() fmt.Println(a) // => 3 fmt.Println(b) // => 7
Multiple arguments
func plus(a int, b int) int { return a + b } func plusPlus(a, b, c int) int { return a + b + c } fmt.Println(plus(1, 2)) fmt.Println(plusPlus(1, 2, 3))
Comments