Basic Function Declarations in Go


As in other programming languages, there are various ways to declare and call functions in Go. Here are some examples:

The Func

func foo() {
  // Do something
}

func foo(bar string) {
  fmt.Println(bar)
}
  • Functions start with the keyword func
  • Variables are optional, but a type should be specified if there is one

Arguments

func foo(bar string, baz string) {
  fmt.Println(bar + baz)
}

func foo(bar, baz string) {
  fmt.Println(bar + baz)  
}
  • Arguments should come with a type
  • Multiple arguments can be assigned to the same type
func foo(bar ...string) {
  for i := 0; i < len(bar); i++ {
    fmt.Println(bar[i])
  }
}

func foo(bar int, baz ...int) {
  // Do something
}
  • ... means multiple arguments are possible
  • When multiple arguments are assigned, it becomes an array in the function
  • One or more arguments are allowed to come before the multiple arguments assignment

Returned Values

func foo() string {
  return "bar"
}
  • Returned values are not necessary
  • If any value is returned, a type should be specified
func foo() (bar string) {
  bar = "buz"
  return
}
  • A variable can be assigned to the returned value
  • Returned values should be in the parantheses
  • If bar is assigned as a returned value, it is already declared, no need to do bar := "something" again
  • If bar is assigned, return will automatically return bar

Custom Types

type Foobar struct {
  Foo string
  Bar string
}

func Baz(foobar Foobar) (bazqux Foobar) {
  bazqux.Foo = foobar.Foo
  bazqux.Bar = foobar.Bar
  return
}
  • Assigning a custom type as a argument or returned value is possible

Methods

When functions are binded to a struct, it becomes a method.

type Foobar struct {
  Foo string
  Bar string
}

func (f Foobar) Baz() {
  fmt.Println(f.Foo)
}
  • It works like an instance method in Ruby while we can initiate like foo := Foobar and call foo.Baz()
  • f represents the instance in the function