So-net無料ブログ作成

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

前回は下のところのソースを動かして、案外標準パッケージでもきちんと実装してるやん、という話に。
 http://qiita.com/taizo/items/bf1ec35a65ad5f608d45

お!ほぼほぼ同じものが
 http://golang.jp/codelab-wiki#tmp_86
英語の元ネタはもうなくなってそうだね。

というか、Qiitaってどこかで見たことのあるドキュメントが多いな。正直、記事以前に書いている人が玉石混合というか、自分のブログでやっとけとかいうレベルのが普通にあるな。有用なものも多いけど、ライターを選んでないし記事も査定されてない。正直、なんか一貫性がない。




package main

import (
	"fmt"
	"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)
}

Qiitaのソースと大体同じなので、こっちで行きますね。
ちょっとGoは久しぶりなので書かんでもわかるようなバカみたいなところも書いていくと思います。

あ、早くもコンパイル通らず。httpをnet/httpにしないとあかん。上のソースはあえて書き直さない。

 
package mainは毎回書かないといけないのかな。ということは、import mainとかすると入れられるのかな。あ、名前が衝突しちゃうからダメか…。名前空間とかGolangはどうなってるんだろ。

importされるものは、fmtとhttpとシンプル。fmtってForMaTの事で、C言語でいうところの stdio.hみたいなもので、入出力をするものは大抵使うっぽい。
 http://golang.jp/pkg/fmt
自分でも、ここからかよ、と思う。でも、わからないと気持ち悪いので調べる。ソースまでは読まないけど。

でもC言語でprintf()とかしょっぱなから使わなきゃいけないけど、printf自体は初心者には相当トリッキーな関数じゃないかと後で思った。そもそも、パラメーターの数が不定な関数ってなかなか作らないよね。そういう要求がないというか、あまりメリットのあるケースが考えにくいというか。

とりあえず、printf()とかscanf()とかの系統の関数もあるわけで、より良いC言語という立ち位置からしたら正解なのかもしれない。


handler()の名前は何でもいいんだろうなぁ。後で明示してパラメーターに与えているから、という理由。うん、変えても問題ないっぽい。


とにかく、続きを見ていこう。
handlerという関数では、
wというhttp.ResponseWriter型と、
rという*http.Request型の引数を取っている。
型と変数の書く順番が逆なのね。大体は型、変数の順番なんだけど少し違和感が。

アクセスがあるところに、具体的に何をするかという事を書いているのだが、
http.HandleFunc("/", handler)
でhandler関数自体が引数に叩き込まれている。
特にオブジェクトというか、肩の中身を生成しているところはないのだけれど(全く引数がない)、自動的にhandler( )の引数のオブジェクトも作られて動作してるって事なんだろうな。
それもGolangの文法として意識してないから、実際に確かめておきたい。プログラミングって暗黙のうちに進んでいてお互いの誤解でバグが出ることも多いから。

handler関数は、http.HandlerFunc型らしいが、使われる先で決まるんだろうか。そもそも関数に型があるのかという疑問が…(他のところに書いてあったから何とも言えないのだが)。関数が実行の対象としているレシーバの型って事かな。いまいちGo言語の型がわかっていないのかも。C言語ともC++のクラスともかなり違うんだよなぁ。暗黙の型変換って事にはならないんだろうか。HandlerFunc()ってのが動作する時は、そこいらの型が強制的に適用されてしまうのだろうか。なんかGolang思ったよりも分かってないぞw。

ちょっともう少し詳しく見てから、自分なりに納得できるところまでソースを追いますわ。ちょっとしんどいけどやらないとわからないしね。それとnet/httpはきちんとできてるっぽいので見ておきたいし。

あと簡単に解説すると、"/"はWebサーバのドキュメントのルートって事ですね。この場合、実際のファイルはないのだけれど、URLにWebアプリの動作を入れるのは一般的なので、実際の動作するファイルを指定するってのも多くはなくなってきているのかな。いやRuby on Railsぐらいしかやっとらんけど。

ListenAndServeの:8080はポートなので、普通に80番ポートで動かさない時にはURLに付けないと動かない。でも80で動かすには管理者権限が必要なので、攻撃があると見込めるサーバには使いたくないな。少なくともLAN内で動かす分には、自作のWebサーバであれば1024以上のポートにしちゃった方が逆に面倒がなくて済むのだろう。

基本事項を確認した後は、httpパッケージを見て今動かしたサーバの動きと作りがどうなっているかを見ておく。あと、サーバのスタティックなファイルをディレクトリごと晒せるようなサーバを作ってみたい。予定は未定。

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

コメント 0