こんにちは。ehama-kです。
8/1(木)に開催された3回目のGo言語の勉強会のレポートをお送りします。

「電車でGo!」
第3回Go会


 
今回は同じ新卒の岡本くんが、社外イベントの「電車でGo!」に参加した際のレポートと、Google App EngineとGo言語に関する話をしてくれました。

  • 電車でGo
    • 都電荒川線を貸切って、三ノ輪駅~早稲田を移動している間車内でGo言語の勉強
    • 実際は、最初の30分くらい参加者みんなテンション上がって、コードは手付かず・・・・(^^;)

  • Google App Engine と Go言語
    • Googleアカウント認証
    • Go言語で掲示板

★Go言語で掲示板

App Engine をimport

import (
	"appengine"
	"appengine/user"
)
これでGoogle App Engine の機能を使うことができます。

また、sdkのインストールは以下からできます。

https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go

設定を書いたapp.yamlを用意すれば、

$ dev_appserver.py myapp/

でローカルで実行出来ます。

アカウント認証

func handler(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
u := user.Current(c)
if u == nil {
url, err := user.LoginURL(c, r.URL.String())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Location", url)
w.WriteHeader(http.StatusFound)
return
}
}
ユーザー情報を入力してログインする部分の実装の一部です。
このhandler関数がアカウント認証の役割を果たしており、ログインしていない場合はログイン画面に遷移するようになっています。
また、間違ったユーザー情報を入力した場合(err != nil)は2つ目のif文の分岐に入り、エラー画面がでます。


また、以下でデータストアにクエリを投げて入力したデータの読み書きを行なっています。

読み込み

q := datastore.NewQuery("Greeting").Order("-Date").Limit(10)
greetings := make([]Greeting, 0, 10)
if _, err := q.GetAll(c, &greetings); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := questbookTemplate.Execute(w, greetings); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}

書き込み

g := Greeting {
Content: r.FormValue("content"),
Date: time.Now(), 
}
if u := use.Current(c); u != nil {
g.Author = u.String()
}

_, err := datastore.Put(c, datastore.NewIncompleteKey(c, "Greeting", nil))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

このように、Google App Engineのデータストアやアカウント認証の機能をGo言語から利用することができます。


次回のレポートもご期待ください!!