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