{"id":1896,"date":"2018-04-28T23:43:48","date_gmt":"2018-04-28T14:43:48","guid":{"rendered":"https:\/\/www.beeete2.com\/blog\/?p=1896"},"modified":"2018-05-04T15:35:52","modified_gmt":"2018-05-04T06:35:52","slug":"a-tour-of-go-exercise%e3%80%80%e3%81%be%e3%81%a8%e3%82%81","status":"publish","type":"post","link":"https:\/\/www.beeete2.com\/blog\/?p=1896","title":{"rendered":"A Tour of Go Exercise\u3000\u81ea\u5df1\u89e3\u7b54"},"content":{"rendered":"<p>A Tour of Go\u306e\u5404Exercise\u3092\u81ea\u5206\u3067\u89e3\u3044\u305f\u3082\u306e\u3002<\/p>\n<p>\u53d6\u308a\u6025\u304e\u306f\u7d50\u679c\u3060\u3051\u3042\u3063\u3066\u308c\u3070OK\u3068\u3057\u3066\u3001\u307e\u3060\u4ed6\u306e\u56de\u7b54\u4f8b\u3092\u898b\u3066\u3044\u306a\u3044\u306e\u3067\u3059\u304c\u3075\u3055\u308f\u3057\u3044\u30b3\u30fc\u30c9\u3067\u306f\u306a\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<h2>Loops and Functions<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"fmt\"\n    \"math\"\n)\n\nfunc Sqrt(x float64) float64 {\n    z := 1.0\n    n := 0.0\n    for i := 0; i < 10; i++ {\n        z -= (z*z - x) \/ (2 * z)\n        if math.Abs(z-n) < 0.0000001 {\n            return z\n        }\n        n = z\n    }\n\n    return z\n}\n\nfunc main() {\n    x := 2.0\n    fmt.Println(Sqrt(x))\n    fmt.Println(math.Sqrt(x))\n}\n<\/code>\n<\/pre>\n<h2>Slices<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport \"golang.org\/x\/tour\/pic\"\n\nfunc Pic(dx, dy int) [][]uint8 {\n    images := make([][]uint8, dy)\n    for y := 0; y < dy; y++ {\n        s := make([]uint8, dx)\n        for x := 0; x < dx; x++ {\n            v := (x + y) \/ 2\n            s[x] = uint8(v)\n        }\n        images[y] = s\n    }\n\n    return images\n}\n\nfunc main() {\n    pic.Show(Pic)\n}\n<\/code><\/pre>\n<h2>Maps<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"golang.org\/x\/tour\/wc\"\n    \"strings\"\n)\n\nfunc WordCount(s string) map[string]int {\n    m := make(map[string]int)\n    words := strings.Fields(s)\n    for i := 0; i < len(words); i++ {\n        word := words[i]\n        v, ok := m[word]\n        if ok {\n            v++\n        } else {\n            v = 1\n        }\n        m[word] = v\n\n    }\n    return m\n}\n\nfunc main() {\n    wc.Test(WordCount)\n}\n\n<\/code><\/pre>\n<h2>Fibonacci closure<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport \"fmt\"\n\n\/\/ fibonacci is a function that returns\n\/\/ a function that returns an int.\nfunc fibonacci() func() int {\n    v1 := 1\n    v2 := 0\n    return func() int {\n        f := v1 + v2\n        v1 = v2\n        v2 = f\n        return f\n    }\n}\n\nfunc main() {\n    f := fibonacci()\n    for i := 0; i < 10; i++ {\n        fmt.Println(f())\n    }\n}\n\n<\/code><\/pre>\n<h2>Stringers<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport \"fmt\"\n\ntype IPAddr [4]byte\n\nfunc (ipaddr IPAddr) String() string {\n    return fmt.Sprintf(\"%d.%d.%d.%d\", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3])\n}\n\nfunc main() {\n    hosts := map[string]IPAddr{\n        \"loopback\":  {127, 0, 0, 1},\n        \"googleDNS\": {8, 8, 8, 8},\n    }\n    for name, ip := range hosts {\n        fmt.Printf(\"%v: %v\\n\", name, ip)\n    }\n}\n\n<\/code><\/pre>\n<h2>Errors<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"fmt\"\n    \"math\"\n)\n\ntype ErrNegativeSqrt float64\n\nfunc (e ErrNegativeSqrt) Error() string {\n    return fmt.Sprint(\"cannot Sqrt negative number: \", float64(e))\n}\n\nfunc Sqrt2(x float64) (float64, error) {\n    if x < 0 {\n        return 0, ErrNegativeSqrt(x)\n    }\n\n    z := 1.0\n    n := 0.0\n    for i := 0; i < 10; i++ {\n        z -= (z*z - x) \/ (2 * z)\n        if math.Abs(z-n) < 0.0000001 {\n            return z, nil\n        }\n        n = z\n    }\n\n    return z, nil\n}\n\nfunc main() {\n    fmt.Println(Sqrt2(2))\n    fmt.Println(Sqrt2(-2))\n}\n<\/code><\/pre>\n<p>\u7121\u9650\u30eb\u30fc\u30d7\u306b\u306a\u308b\u4ef6\u306f\u539f\u56e0\u307e\u3067\u306f\u308f\u304b\u3089\u305a\u30fb\u30fb\u30fb\u3002<br \/>\n\u3082\u3046\u5c11\u3057\u7406\u89e3\u3092\u6df1\u3081\u3066\u8003\u3048\u308b\u3053\u3068\u306b\u3057\u3066\u6b21\u306b\u9032\u3080\u3002<\/p>\n<h2>Readers<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"golang.org\/x\/tour\/reader\"\n)\n\ntype MyReader struct{}\n\nfunc (reader MyReader) Read(b []byte) (int, error) {\n    for i := 0; i < len(b); i++ {\n        b[i] = 'A'\n    }\n\n    return len(b), nil\n}\n\nfunc main() {\n    reader.Validate(MyReader{})\n}\n<\/code><\/pre>\n<h2>rot13Reader<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"io\"\n    \"os\"\n    \"strings\"\n)\n\ntype rot13Reader struct {\n    r io.Reader\n}\n\nfunc (reader rot13Reader) Read(buffer []byte) (int, error) {\n    c, err := reader.r.Read(buffer)\n    if err != nil {\n        return c, err\n    }\n\n    for i := 0; i < c; i++ {\n        b := buffer[i]\n        if (b >= 'A' && b <= 'M') || (b >= 'a' && b <= 'm') {\n            buffer[i] = b + 13\n        } else if (b >= 'N' && b <= 'Z') || (b >= 'n' && b <= 'z') {\n            buffer[i] = b - 13\n        }\n\n    }\n\n    return c, err\n}\n\nfunc main() {\n    s := strings.NewReader(\"Lbh penpxrq gur pbqr!\")\n    r := rot13Reader{s}\n    io.Copy(os.Stdout, &#038;r)\n}\n<\/code><\/pre>\n<p>map\u3067\u5909\u63db\u30c6\u30fc\u30d6\u30eb\u4f5c\u308d\u3046\u3068\u601d\u3063\u305f\u306e\u3067\u3059\u304c\u30b3\u30fc\u30c9\u5224\u5b9a\u306b\u3057\u307e\u3057\u305f\u3002<br \/>\n\u4e00\u6483\u3067\u5909\u63db\u3067\u304d\u306a\u3044\u304b\u8003\u3048\u305f\u306e\u3067\u3059\u304c\u6b8b\u5ff5\u306a\u304c\u3089\u5230\u9054\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u305a\u30fb\u30fb\u30fb\u3002<\/p>\n<h2>Images<\/h2>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"golang.org\/x\/tour\/pic\"\n    \"image\/color\"\n    \"image\"\n)\n\ntype Image struct{}\n\nfunc (i Image) ColorModel() color.Model {\n    return color.RGBA64Model\n}\n\nfunc (i Image) Bounds() image.Rectangle {\n    return image.Rect(0, 0, 250, 250)\n}\n\nfunc (i Image) At(x, y int) color.Color {\n    v := uint8((x + y) \/ 2)\n    return color.RGBA{v, v, 255, 255}\n}\n\n\nfunc main() {\n    m := Image{}\n    pic.ShowImage(m)\n}\n<\/code><\/pre>\n<h2>Equivalent Binary Trees<\/h2>\n<p>\u3059\u3054\u3044\u6642\u9593\u304c\u304b\u304b\u308a\u307e\u3057\u305f\u30fb\u30fb\u30fb\u3002<br \/>\nChannel\u306e\u6982\u5ff5\u304c\u3044\u307e\u3044\u3061\u7406\u89e3\u3067\u304d\u3066\u3044\u306a\u304f\u3066Print\u6587\u3092\u51fa\u3057\u3066\u3044\u308d\u3044\u308d\u8003\u3048\u307e\u3057\u305f\u3002<br \/>\n\u8a00\u3044\u65b9\u304c\u6b63\u3057\u3044\u304b\u4e0d\u660e\u3067\u3059\u304c\u30b9\u30c8\u30ea\u30fc\u30e0\u307f\u305f\u3044\u306a\u3082\u306e\u3068\u8003\u3048\u308b\u3068\u5c11\u3057\u7406\u89e3\u304c\u3067\u304d\u307e\u3057\u305f\u3002<br \/>\n\u3067\u3059\u304c\u5358\u306b\u52d5\u304f\u3060\u3051\u3002<br \/>\ngoroutine\u306f\u307e\u3060\u307e\u3060\u5b9f\u8df5\u4e0d\u8db3\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"golang.org\/x\/tour\/tree\"\n    \"fmt\"\n)\n\n\/\/ Walk walks the tree t sending all values\n\/\/ from the tree to the channel ch.\nfunc Walk(t *tree.Tree, ch chan int) {\n    if t == nil {\n        return\n    }\n    Walk(t.Left, ch)\n    ch <- t.Value\n    Walk(t.Right, ch)\n}\n\n\/\/ Same determines whether the trees\n\/\/ t1 and t2 contain the same values.\nfunc Same(t1, t2 *tree.Tree) bool {\n    ch1 := make(chan int)\n    ch2 := make(chan int)\n\n    go func() {\n        Walk(t1, ch1)\n        close(ch1)\n    }()\n    go func() {\n        Walk(t2, ch2)\n        close(ch2)\n    }()\n\n    for {\n        v1, close1 := <- ch1\n        v2, close2 := <- ch2\n        if v1 != v2 {\n            return false\n        }\n        if !close1 &#038;&#038; !close2 {\n            return true\n        }\n    }\n\n    return false\n}\n\nfunc main() {\n    \/\/ Walk\n    t := tree.New(1)\n    ch := make(chan int)\n    go func() {\n        Walk(t, ch)\n        close(ch)\n    }()\n    for n := range ch {\n        fmt.Println(n)\n    }\n\n    \/\/ Same\n    fmt.Println(\"tree 1 eq 1 = \", Same(tree.New(1), tree.New(1)))\n    fmt.Println(\"tree 1 eq 2 = \", Same(tree.New(1), tree.New(2)))\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A Tour of Go\u306e\u5404Exercise\u3092\u81ea\u5206\u3067\u89e3\u3044\u305f\u3082\u306e\u3002 \u53d6\u308a\u6025\u304e\u306f\u7d50\u679c\u3060\u3051\u3042\u3063\u3066\u308c\u3070OK\u3068\u3057\u3066\u3001\u307e\u3060\u4ed6\u306e\u56de\u7b54\u4f8b\u3092\u898b\u3066\u3044\u306a\u3044\u306e\u3067\u3059\u304c\u3075\u3055\u308f\u3057\u3044\u30b3\u30fc\u30c9\u3067\u306f\u306a\u3044\u3068\u601d\u3044\u307e\u3059\u3002 Loops and F &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[81],"tags":[],"views":3117,"_links":{"self":[{"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1896"}],"collection":[{"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1896"}],"version-history":[{"count":13,"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1896\/revisions"}],"predecessor-version":[{"id":1910,"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1896\/revisions\/1910"}],"wp:attachment":[{"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.beeete2.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}