【Go】A Tour of GOの練習問題的なアレ

更新が滞ってしまっていたので、勉強でやってたついでで投げるスタイル

要は忘備録

わからなかったものは Qiita の誰かの投稿を参考…どころか、そのままだったりする
完成されたコードをこれ以上手直しする必要がないので仕方ないね

A Tour of GO とは

Go言語の公式の入門用、ブラウザでプログラムを動かして試せるサイト

Go言語の公式サイト(https://golang.org/)のDocumentsにリンクがあるのだが、これは英語版
英語のA Tour of Go:(https://tour.golang.org/welcome/1

これの日本語版が別にある
日本語のA Tour of Go:(https://go-tour-jp.appspot.com/welcome/1

ありがたみ

ついで

なんかブラウザ上で試せる楽しいサイトも有る
しかもコードを書いてシェアでリンクを作成すると公開できる

勉強が楽かよ

公式っぽい「The Go Playground」:(https://play.golang.org/
どなたかの「The Go Play Space」:(https://goplay.space/

詳しくは比べてないのでどちらが好みかは試してください

例題たち

Exerciseと称して「こういうのを用意したからホニャララを自分で作ってみろ(答えはない)」という試練を与えるページがTourの途中に時々ある

ネットで探すと先達たちが回答例を公開している
難しかったら有り難みを感じながら答えを見てから考えよう(諦め

わからないものはわからない

method編の5個をとりあえず書いてみる

先に本来の問題ページ
https://go-tour-jp.appspot.com/methods/18
https://go-tour-jp.appspot.com/methods/20
https://go-tour-jp.appspot.com/methods/22
https://go-tour-jp.appspot.com/methods/23
https://go-tour-jp.appspot.com/methods/25

methods 18

https://go-tour-jp.appspot.com/methods/18

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.
func (p IPAddr) String() string {
	return fmt.Sprintf("%v.%v.%v.%v", p[0],p[1],p[2],p[3])
}

func main() {
	hosts := map[string]IPAddr{
		"loopback":  {127, 0, 0, 1},
		"googleDNS": {8, 8, 8, 8},
	}
	for name, ip := range hosts {
		fmt.Printf("%v: %v\n", name, ip.String())
	}
}

https://play.golang.org/p/Q4bcrdJFgx6

methods 20

https://go-tour-jp.appspot.com/methods/20

平方根を出す
Squrt(*)の*に入れる数字を変えて平方

package main

import (
	"fmt"
	"math"
	"errors"
)

type ErrNegativeSqrt float64
func (e ErrNegativeSqrt) Error() string{
	return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}
func Sqrt(x float64) (float64, error) {
	if x < 0 {
		e := errors.New(ErrNegativeSqrt(x).Error())
		return math.Sqrt(x), e
	}
	z := float64(1)
	for i := 0; i<10; i++{
		z = z - (z*z-x)/(2*z)
	}
	fmt.Println(z)

	return math.Sqrt(x), nil
}

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

https://play.golang.org/p/Ni2Jqn8TJml

methods 22

https://go-tour-jp.appspot.com/methods/22

reader.Validate() が何やってるかは、ここを見る
https://github.com/golang/tour/blob/master/reader/validate.go#L13

package main

import "golang.org/x/tour/reader"

type MyReader struct{}

// TODO: Add a Read([]byte) (int, error) method to MyReader.
func (v MyReader)Read(b []byte)(int, error){
	for i := range b {
		b[i] = 'A'
	}
	
	return len(b), nil
}

func main() {
	reader.Validate(MyReader{})
}

https://play.golang.org/p/7WR-z5mS8IV

methods 23

https://go-tour-jp.appspot.com/methods/23

問題文にあるROT13が何だっていうパンピーだった

優しいのでリンク付き

package main

import (
	"io"
	"os"
	"strings"
)

type rot13Reader struct {
	r io.Reader
}

func (rot13 rot13Reader) Read(b []byte) (int, error) {
    n, err := rot13.r.Read(b)
    for i := range b {
        if b[i] >= 'A' && b[i] <= 'M' || b[i] >= 'a' && b[i] <= 'm' {
            b[i] += 13
        } else if b[i] >= 'N' && b[i] <= 'Z' || b[i] >= 'n' && b[i] <= 'z' {
            b[i] -= 13
        }
    }
    return n, err
}

func main() {
	s := strings.NewReader("Lbh penpxrq gur pbqr!")
	r := rot13Reader{s}
	io.Copy(os.Stdout, &r)
}

https://play.golang.org/p/22nCBLmNVNv

methods 25

https://go-tour-jp.appspot.com/methods/25

v := uint8((x+y)/2) の
unit8( ) 内の式を書き換えると生成される画像が変わるので遊べる

package main

import (
	"golang.org/x/tour/pic"
	"image"
    "image/color"
)

type Image struct{}

func (img Image) ColorModel() color.Model {
    return color.RGBAModel
}

func (img Image) Bounds() image.Rectangle {
    return image.Rect(0, 0, 256, 256)
}

func (img Image) At(x, y int) color.Color {
    v := uint8((x+y)/2)
    return color.RGBA{v, v, 255, 255}
}

func main() {
	m := Image{}
	pic.ShowImage(m)
}

https://play.golang.org/p/xZWoR2-OqD2

おわり

ソースコードを書くと文字数がいっぱい

折角だからThe Go Playground を使ったけど、ぶっちゃけソースコードをTourでコピペすれば動くはずだからいらない気がする

おわり

‘ω’)ノシ

コメントを残す

メールアドレスが公開されることはありません。