Skip to content

Function

go
func average(xs []float64) float64 {
  total := 0.0
  for _, v := range xs {
      total += v
  }
  return total / float64(len(xs))
}

// Return value can be named
func f2() (r int) {
  r = 1
  return
}

// Can return multiple values
func f() (int, int) {
  return 5, 6
}
func main() {
  x, y := f()
}

// Zero or Multiple input parameters
func add(args ...int) int {
  total := 0
  for _, v := range args {
    total += v
  }
  return total
}
func main() {
  fmt.Println(add(1,2,3))
}

// Destruct and pass slice items to function
func main() {
  xs := []int{1,2,3}
  fmt.Println(add(xs...))
}

Closure

go
func makeEvenGenerator() func() uint {
  i := uint(0)
  return func() (ret uint) {
    ret = i
    i += 2
    return
  }
}
func main() {
  nextEven := makeEvenGenerator()
  fmt.Println(nextEven()) // 0
  fmt.Println(nextEven()) // 2
  fmt.Println(nextEven()) // 4
}

Defer

go
package main

import "fmt"

func first() {
  fmt.Println("1st")
}

func second() {
  fmt.Println("2nd")
}

func main() {
  defer second()
  first()
}

Means:

go
func main() {
  first()
  second()
}

Panic & Recover

go
package main

import "fmt"

func main() {
  // Defer postponed the function execution until end of current function
  defer func() {
    str := recover()
    fmt.Println(str)
  }()
  panic("PANIC")
}