• home
  • Go言語 関数の色々

Go言語 関数の色々

この記事はWanoグループ Advent Calendar 2016の24日目の記事です。

Goの関数宣言方法

package main
import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

//普通の使い方
func Abs(v Vertex) float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

//オブジェクトにメソッドを追加する
func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

//自分のオブジェクトを作って、そこにプリミティブ型のメソッドを追加する
type MyFloat float64
func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

func main() {
    v := Vertex{6, 8}
    f := MyFloat(-10.3)
    fmt.Println("v.Abs():",v.Abs())
    fmt.Println("Abs(v):",Abs(v))
    fmt.Println(f.Abs())
}

Goは、関数の引数として関数をわたすことができる。

package main
import (
    "fmt"
    "math"
)

/*
funinside func(float64, float64) float64 ==> 関数の引数
  関数名     引数1,  引数2   戻り値
*/
func compute(funinside func(float64, float64) float64 ,x,y float64) float64 {
    return funinside(x,y)
}

func add(x,y float64) float64 {
    return x+y
}
/*
compute (関数の引数,引数A,引数B)  関数替わり可能
*/
func main() {
    fmt.Println(compute(add,3,3))      //=> 3+3 
    fmt.Println(compute(math.Pow,3,3)) //=> 3^3
}

結果:
6
27

クロージャの使い方

package main
import "fmt"
// fibonacci is a function that returns a function that returns an int.
func fibonacci() func() int {  //匿名関数
    a, b := 0, 1
    return func() int {
        a, b = b, a+b  // (a = b), (b = a + b) 同時実行の意味 =>
        /* 同じコード
        c:= a
        a = b
        b = c + b
        */
        return a
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Print(f()," ")
    }
}

結果:
1 1 2 3 5 8 13 21 34 55