会社でGo勉強会してた.A Tour of Goを進めてる.
これは,数のクラスみたいなやつで,mynumber()
するたびに,キーがstring
で値がfunc(int) int
であるmap
を返す.["add"](1)
とかすると,クロージャの中の値が書き換えられて返される.このことで,オブジェクトみたいなのを作ってみてる.おもしろいけど,問題があって,mapの値として,intを取ってintを返す関数しか持てない.現在の値を返すget()
っていう関数は作れなくて,get(0)
みたいにとりあえず意味ない値を渡す必要がある.
package main import "fmt" func mynumber() map[string]func(int) int { sum := 0 result := make(map[string]func(int)int) result["add"] = func(x int) int { sum += x return sum } result["sub"] = func(x int) int { sum -= x return sum } return result } func main() { number1 := mynumber() number2 := mynumber() fmt.Println(number1["add"](1)) fmt.Println(number1["add"](1)) fmt.Println(number1["add"](1)) fmt.Println(number1["sub"](2)) fmt.Println(number1["sub"](2)) fmt.Println(number1["sub"](2)) fmt.Println(number2["add"](10)) fmt.Println(number2["add"](10)) fmt.Println(number2["add"](10)) }
https://gist.github.com/hitode909/7561822
これは立方根を求めるやつ.ニュートン法だから,何度か計算すると値が収束するのだけど,これは,Cbrt
を呼ぶと,呼ばれるたびに一度計算を進めて返す関数を返す.返ってきた関数を何度も呼ぶことで値が収束する.おもしろいだけで意味はない.
package main import "fmt" func Cbrt(x complex128) func() complex128 { z := complex128(1) return func() complex128 { z=z-(z*z*z-x)/(3*z*z) return z } } func main() { cbrt2:=Cbrt(2) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) fmt.Println(cbrt2()) }
https://gist.github.com/hitode909/7562180
学習が進んでておもしろいけど,役に立つもの全く作ってなくておもしろい.