perl のプログラムを go に移植してみて
気が向いたので fujiwara さんが以前作った Urume のクライアントである mezasi という perl で書かれたものを go に移植してみた。
https://github.com/soh335/go-mezasi
以下感想
- サブコマンドの仕組みは github.com/gonuts/commander と github.com/gonuts/flag を使った。
- useragent とかを固定化したいとなると下みたいに http.Client の簡単なラッパーを書くのが良い?
package main import ( "io" "net" "net/http" "net/url" "time" ) type Client struct { UserAgent string client *http.Client EndPoint *url.URL } func NewClient(endpoint *url.URL) *Client { return &Client{ UserAgent: "Mezasi/0.1", client: &http.Client{ Transport: &http.Transport{ Dial: func(netw, addr string) (net.Conn, error) { return net.DialTimeout(netw, addr, time.Duration(time.Second*300)) }, }, }, EndPoint: endpoint, } } func (c *Client) Do(req *http.Request) (*http.Response, error) { return c.client.Do(req) } func (c *Client) NewRequest(method string, pathStr string, body io.Reader) (*http.Request, error) { urlPath, err := url.Parse(pathStr) if err != nil { return nil, err } u := c.EndPoint.ResolveReference(urlPath) req, err := http.NewRequest(method, u.String(), body) if err != nil { return nil, err } req.Header.Add("User-Agent", c.UserAgent) return req, nil }
こんな感じでタイムアウトの処理と、request object を作るメソッド、実行するメソッドを用意した。 request object を作るときに endpoint をもとに url を作ったり、 user-agent の追加をしたりした。
- 起動が早い