[Golang]関数の仕様について

ざっと確認してみたので列挙する

package main

import (
    "fmt"
)

func main() {
    fmt.Println(plus(10,45))

    hello()

    a, b := div(20, 32)
    fmt.Println(a,b)

    // 戻り値の破棄
    a2, _  := div(20, 32)
    fmt.Println(a2)


    fmt.Println(hoge())
    fmt.Println(hoge2())

    fmt.Println(div2(4,3))

    // 無名関数 (クロージャ)
    f := func(x, y int) int { return x + y }
    fmt.Println(f(4,3))
    // 無名関数の型定義の確認
    fmt.Printf("%T\n", f)

    // 関数の代入
    var f_alias = f // f_alias := f でも同じ
    fmt.Printf("%T\n", f_alias)

    // 関数を返す関数
    returnFunc()()

    // 関数を引数に取る関数
    callFunc(returnFunc())
}

// ベーシックな関数定義
func plus(x, y int) int {
    return x + y
}

// 戻りの型定義を省略したらvoidになる
func hello() {
    fmt.Println("hello world")
    return // 戻り値がない場合はあってもなくても
}

// 複数の戻り値
func div(x, y int) (int, int) { // 戻り値の型定義のカッコは省略できない
    a := x + y
    b := x - y

    return a, b
}

/*
  戻り値を表す変数
*/
// 関数内のローカル変数定義の省略
func hoge() (a int) {
    return
}

// hogeと同じ
func hoge2() int {
    var a int
    return a
}


// div()のローカル変数定義を省略してみる
func div2(x, y int) (a, b int) {
    a = x + y
    b = x - y

    return a, b
}


// 関数を返す関数
func returnFunc() func() {
    return func() {
        fmt.Println("I'm a function")
    }
}

// 関数を引数に取る関数
func callFunc(f func()) {
    f()
}

ソースはこちら