投稿

ラベル(golang)が付いた投稿を表示しています

[Go] Windowsで実行した時、窓を表示させない

例えば、デスクトップでそのexeをダブルクリックした時、あのDOS窓を開きません! Goでは、ビルドオプションで設定できるんですって! こんなのあるなんて知らなかったー。 痒いところに手が届くわー。 go build -ldflags="-H windowsgui" こんな機能に用があるの、自分だけかもしれないけど。

[Go] static fileを返すだけのweb serverを作ってみた

静的なファイルを返すだけのSimpleなWeb Serverを、Go言語で作ってみた。 テスト用のHTMLとして、 c:/webroot/webフォルダにhoge.htmlを適当に作ってくれ。 go run webserver.go で実行。 ブラウザを立ち上げて、下記のURLを表示してみてくれ! http://localhost:8085/web/hoge.html hoge.htmlが表示されるはずだ。 今回のポイントは・・・ http.HandleFuncってpathの最後に"/"つけると、ディレクトリ指定になるんだね Goでファイルを読み込む方法 WriteでbufをSliceして渡すのがGoっぽくてイイネ!Javaだとlength指定が必要だもんね defer、ちょっ、コレ、ラクちんだわ~。もうtry..finallyとかタイプしたくない。 ラベル付きbreakも地味にいいわ~。これがあってswitchが生きる。 結論。 やればやるほどGo言語。

[Go] http HandleFunc Tips

/hogeにアクセスされた時、fを呼ぶ http.HandleFunc("/hoge",f) /hogeディレクトリにアクセスされた場合、fを呼ぶ http.HandleFunc("/hoge/",f) /hoge/aaaでも、/hoge/aa/bbでもヒットする。 正規表現でルーティングしたい場合、工夫が必要。 一旦、ディレクトリ指定で受け取り、自前でルーティングするのだ。 うむむ、なるほど~。

[Go] mapのソート

配列のソートは強力だけど、 mapのソートは、JavaのTreeSetみたいには行かないようだね。

[Go] Push配信サーバーを作ってみた

GoでPush配信サーバーを作ってみた。 go run gopush.go で実行すると8085ポートで待ち受け開始。 別のターミナルとかで、 curl -v http://localhost:8085/con?key=hoge ってやると配信を受けられる。 ブラウザとかで、 http://localhost:8085/api/push?key=hoge&mes=hello にアクセスすると、ターミナルにhelloが通知されるよ! このkeyで通知先を変更するのだ。 こんなの簡単に作れちゃうGo言語、すごいね! goroutine(go/channel/select)が強力すぎて、Javaのwait/notifyとか戻れないよ!

[Go] http、chunked、切断検知、TimeOut、channelのclose

Push配信するhttpサーバーを目指すサンプル。 盛り込んだ要素は下記の通り。 httpサーバー →普通です。すみません。 Transfer-Encoding: chunked →しょっぱなにw.WriteHeader(http.StatusOK)、  そして、w.(http.Flusher).Flush() goroutine&channel time.Sleep →渡す値は、単位を掛ける。 channelのcloseとその検知方法 →close()は組み込み関数。  そしてchannel受信には2番目の戻り値があることを知れ timeoutを仕掛ける方法 time.Afterでchannelゲットだぜ 通信切断の検知方法 →w.(http.CloseNotifier).CloseNotify()でchannelゲットだぜ 複数channelの同時受信 →selectをforで無限ループだぜ。あとラベル付きbreak。 ロギング →log.Println()だぜ。 盛りだくさんだぜ~

[Go] Chunked Transferで返すHTTPサーバー

HTTPのストリーミングサーバーのいわゆるLong Pollingってヤツ。 net/httpを使う普通のやり方に加えて、 ポイントは WriteHeaderを先に呼ぶ http.ResponseWriterをFlushする ってこと。 Transfer-Encodingヘッダをchunkedにするとか、 Content-Lengthヘッダをセットしてはいけないとか、 は、勝手にやってくれる。 これを起動したならば、curlコマンドで試してみませう。 curl -v http://localhost:8085/ ヘッダが表示され、 < HTTP/1.1 200 OK < Date: Fri, 24 Oct 2014 05:14:14 GMT < Content-Type: text/plain; charset=utf-8 < Transfer-Encoding: chunked その5秒後に one その5秒後に two が表示される!

[Go言語] 豆知識、小ネタ

まだまだよくわかっていないGo言語。 何をするにもどん詰まる。とにかく小ネタを記録する。 byte配列を文字列(string)に変換する var s = make([]byte,10) s[0] = 'a' fmt.Printf("result=%s",string(s) ) stringをbyte配列に変換する s := "test" b := []byte(s) 何でも入るmapを作る(keyは文字列) m := make(map[string]interface{}) m["first"] = "test" fmt.Printf("result=%s",m ) mapをJSON化する "encoding/json"のimportが必要 m := make(map[string]interface{}) m["f"] = "test" r,_ := json.Marshal(m); fmt.Printf("result=%s",string(r) ) JSON文字列をmap化する "encoding/json"と"strings"のimportが必要 s := strings.NewReader(`{"f":"test"}`) d := json.NewDecoder( s ) m2 := make(map[string]interface{}) d.Decode(&m2) fmt.Printf("result=%s",m2 ) TimeをJSON化する time.Timeはjson.MarshalでJSON化してくれないようだ。 というわけで、マニュアルでJSON化。 t := time.Now() s,_ := t.MarshalJSON() fmt.Printf( "%s", s ) string...