Golangに入門してみた: Exercise: Loops and Functions

最近、転職活動をしているときにgRPCについての話があり、あまり詳しく知らなかったのでハンズオンしたいな、と思いどうせならgRPCの醍醐味である別言語間での通信を実現してみたいなと思い、現在使えるJavaScript, Python, Rubyに加え、流行のGolangを用いてAPI作ってみたいなと思い、Glangのtutorialをやってみました。

そこで、とりあえずGolangのfor文 + if文を使って平方根を求めるエクササイズがあったので、それをググりながら書いてみた。そこまで難しくないし、ヒントも出されているので、5分くらいで終わったのですが、その回答を載せます。答えは見てないので、非効率なプログラム書いているかもしれませんが、まぁいいでしょう。

エクササイズ内容

こちらのページのエクササイズを行いました。
https://go-tour-jp.appspot.com/flowcontrol/8

回答内容

package main
import (
    "fmt";
    "math"
)

func Sqrt(x float64) float64 {
    z := float64(1) // 初期値
    for i := 0; i < 100; i++ {
        prev_z := z
        z -= (z*z - x) / (2*z)

        if math.Abs(prev_z - z) < 0.0000001 {
            return z
        }
    } 
    return z
}

func main() {
    fmt.Println(Sqrt(2))
    fmt.Println(math.Sqrt(2))
}

出力----------------------
1.4142135623730951
1.4142135623730951

math.Sqrt(2)と同様の答えになったので、良いでしょう。

次に値が変化しなくなった (もしくはごくわずかな変化しかしなくなった) 場合にループを停止させます。

この部分をどう再現するかがもっと別の書き方あるような気がしますが、もし他に「この書き方がいいよ!」というのがあれば教えてください。

感想

Golang初めて触ってみましたが、型指定とかあっていいですね。
Pythonは型指定ないので機械学習の実装しているときに、この変数のデータには何が入っているのだろう?と思うことがあるのでGlangで機械学習実装できたら嬉しいですね。

Pythonでも型指定みたいなことできるので、型が間違っていればエラーを出すようにすればいいのでしょうけども。

あと、3,4章くらいtutorialがあるので、それもやってしまおうと思います。