So-net無料ブログ作成

Goで簡易Webサーバ4 [プログラミング]

書いておいたのだけれど、アップするの忘れてたから今さら書きます。

前回はnet/httpを使って簡単なWebサーバが作れることが分かった。でもGolangの理解が薄くて、いまいち分かっていないのが現状でした。でも、Golang自体はOSSだと思うので、標準パッケージの中身は見ればわかる状態にはなっていると思う。

よくわかってない部分として
・型全般とメソッドとのからみ。
・標準パッケージ全般。
・並行プログラミング(Goroutine、Channelとか)
・インターフェイス関連。

なので、その部分を限定的に突っ込んでみる。あくまで限定的に。紙媒体の資料がWEB+DB Pressしかないので、正直体系的に勉強できてないところがあったり。そろそろなにがしかの本を買っても良い頃かもしれない。

 
簡易Webサーバのソースを見て動かしたんだけど、ほぼ標準パッケージ側がしっかり実装しているので、そちらをじっくり読まないといけないなという事になった。とはいえ、取っ掛かりというか、実際動いているところ、実装部分を見てみたいと思う。上手く見られないかもだけど。
package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}


とりあえず、net/httpの標準パッケージを見ておかないといけないかも。文法はそこで気になったところだけあげつらっていけばいい。というか、ソースはどこにあるのだろうか。

 /usr/local/Cellar/go/1.3/libexec/src/pkg/net/http

HTTPはここらへんのディレクトリにありそう。あ~あるね。ちなみにMacでHomebrewで入れたものですから、Linuxとかではディレクトリは当然違います。

// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers.  If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler object that calls f.
type HandlerFunc func(ResponseWriter, *Request)


ん?これだとHandleFunc()自体がハンドラになってるんですけど…。
あ、違った。前のはHandlerFunc()でしたw。HandleFunc()はこっちでした。

// HandleFunc registers the handler function for the given pattern.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
	mux.Handle(pattern, HandlerFunc(handler))


ううむ、この程度のソースでへたばってたらダメだな。どうにもWindowsとかの商用開発環境に慣れきってしまったので、OSSで自ら深堀ってのは性に合わない。性に合わないというか、あんま慣れてない。ドキュメントがないところはソース見ろって文化がいいのだけれど、ドキュメントとサンプルがあった方がいいに決まっている。


とりあえず、Goは構造体があって、それを操作する関数を用意するみたいな感じになっている。データの持って行き方がオブジェクト指向っぽくはない。メソッドなメンバーを構造体の中に入れちゃうのがオブジェクト指向に近いが、特定の構造体をいじる関数という意味合いが強い気がする。そこに従来通り引数と、複数返せる戻り値がいきなり宣言のところで全部書くから、少々煩雑に見えてしまう。中身を見ないで、関数を大体想像するにはこの書き方の方が一つにまとまっていて見やすいと言えば見やすい。

気にするのは、頭に書く構造体をレシーバと言うらしいんだけど、そこはコピー渡しなので変更を反映したいときにはポインタを渡すようになっている。まことにC言語っぽい。でも、色々なところがCから逸脱しているから気にするところは気にしないとあかん。言語仕様は大きくないけど、CともC++ともつかないので、どっちかでも知っている人が見ると気持ち悪いところが散見される。言う事はわかるんだけど、似てるだけにやっぱ気持ち悪い。

http://m0t0k1ch1st0ry.com/blog/2014/06/09/golang/

先人がソースをトレースしているので、それを見ればちょっとわかるかと思ったけど、正直足りない。いわゆるシーケンス図を思い描けない。自分でやれって事だよね。分かります、わかっています(T-T)。

HTTP/2.0にもつながるところなので、ここの大まかな流れは知っておいた方がいいですね。HTTP/1.1の改良として2.0があるので、オブジェクト指向でオーバーライドするほどではないにしても、構造をまねることは前に書いた人にもわかりやすさにもつながるでしょうし。あんまり設計思想が良くなかったら変えるんでしょうけど、その前の状態の人なので日和ますw。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0