2017年3月8日水曜日

Go で超簡単な Web アプリを作成してみた

概要

Go で簡単な Web アプリを作成してみました
本当に簡単なアプリでビルトインのライブラリだけで動作します
事前に Go のインストールと $GOPATH の設定は行っておいてください

環境

  • CentOS 6.6
  • Go 1.6

Web アプリの作成

特に Github に公開する予定はないですが、Go のルールに従ってコーディングしていきます

  • touch $GOPATH/src/github.com/hawksnowlog/hello/main.go
package main

import (
        "fmt"
        "net/http"
)

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

func Hello() string {
        return "Hi there, I love"
}

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

8080 ポートでサーバを起動してアクセスしたパスと文字列を表示するサンプルです
net/http がビルトインのライブラリなのでコピペするだけで動作します

ビルド

コードをビルドして実行可能なバイナリファイルを作成します

  • go install github.com/hawksnowlog/hello

$GOPATH/bin/hello が作成されます
go build でもビルドしてバイナリを作成することができますが Go のルールに従ったパスでコードを管理しているので go install のほうがいいです
go build の場合、コマンドを実行したカレントにバイナリを作成します

動作確認

ではバイナリを実行します

  • $GOPATH/bin/hello

でエラーが発生せずプレグラウンドで動作し始めます
確認は curl http://localhost:8080/hoge とかにアクセスすると「Hi there, I love hoge!」と表示されます

テスト

ついでにテストも作成してみました

  • touch $GOPATH/src/github.com/hawksnowlog/hello/main_test.go
package main

import (
        "testing"
)

func TestHello(t *testing.T) {
        actual := Hello()
        expected := "Hi there, I love"
        if actual != expected {
                t.Errorf("got %v\nwant %v", actual, expected)
        }
}

テストファイルにも命名規則があるみたいで xxx_test.go というファイル名がいいみたいです
これで

  • go test github.com/hawksnowlog/hello

で実行することができます
直接ファイルを指定して実行してしまうと

# command-line-arguments
src/github.com/hawksnowlog/hello/main_test.go:8: undefined: Hello
FAIL command-line-arguments [build failed]

というエラーになってしまうのでご注意ください

最後に

超簡単な web アプリを作成してみました
テストも書きましたが実際にリクエストするようなエンドツーエンドではないのはすいません
テンプレートなどの機能も初めからあるみたいです
とはいえたぶんちゃんと書こうとしたら revel とか gin とかを使うんだと思います

Tips

  • go build でバイナリが作成されない

package main でない場合はバイナリが作成されないみたいです

When the command line specifies a single main package,
build writes the resulting executable to output.
Otherwise build compiles the packages but discards the results,
serving only as a check that the packages can be built.

参考サイト

0 件のコメント:

コメントを投稿