2012年2月3日金曜日

Google App Engine Go SDK(Go1ベータ版搭載版)が公開されています

Go1betaが搭載されたGoogle App Engine SDKが公開されています。
http://code.google.com/p/appengine-go/downloads/list

先日公開されたGoogle App Engine SDK 1.6.2はr60.3という
ちょっと古めのバージョンのままでしたが、
もうすぐGo1がリリースされるのと、最新のGo言語と書き方も違うというのも
開発者からすると大変ですので、ここで、どのような違いがあるかを
まとめておきたいと思います。
(※恐らく、正式版でも大きな変更はないと思いますが、あくまでもGo1ベータでの
違いの確認です。また、ベースは私の書籍のプログラムをベースに見ていきます。)

なんとなくですが、近いうちに公式リリースもされそうな気がするので、
先にこのGo1betaで慣れておく方が良いかもしれません。

最新ドキュメントのURL
http://weekly.golang.org/

私の書籍「Go言語プログラミング入門 」でもリリース後は
読み替える必要がありますのでご注意下さい。

  • app.yamlのapi_versionは"3"ではなく、"go1beta"となります。
    • ※これに関しては、正式なリリースになれば変更されるでしょう。
  • httpパッケージ→"net/http"に変更
    • 通信関係のパッケージは大体netパッケージ以下に移動しています。したがって、これまでは、import "http"でしたが、import "net/http"となります。
  • os.Error→"error"に変更
    • Errorは、osパッケージで定義されたインターフェイスでしたが、パッケージ内のインターフェイスではなく、Go言語全体(?)で使えるインターフェイスになりました。また、エラーメッセージを取得するメソッド名がString()からError()に変わっています。
  • time.SecondsToLocalTime()がtime.Unix()に変更
    • これまで、ローカル時間を取得するメソッドはSecondsToLocalTime()でしたが、Unix()に変わっています。Unix()メソッドは、第1引数が秒までを指定し、第2引数でナノ秒(小さい時間)を指定するようになっています。
  • time.Seconds()がtime.Now()に変更
    • 現在日時を取得するメソッドが変更されています。Seconds()はメソッドになりました。秒を取得します。また、time構造体の中身が秒、ナノ秒、Location位置の3つで管理されるようになっています。
  • templateパッケージがtext/templateに変更
    • 使い方は変わっていませんが、templateパッケージが移動しているようです。
  • template.ParseFile()が、template.ParseFiles()に変更(2012/02/03追記)
    • template.ParseFile()でファイルを1つのみ解析していましたが、引数に複数のファイル名を渡す事で、複数のファイルを解析できるようになっています。これまで通り、1つでも実行できますので、メソッド名のみ変更しておけば問題ありません。
  • template.Must(template.New("html").ParseFiles("sample.html"))→template.Must(template.ParseFiles("sample.html"))にする。
    • template.ParseFiles()がtemplate構造体のメソッドと関数の2つに増えています。単純にhtmlを読み込んで実行するの(書籍の例など)であればtemplate.ParseFiles("sample.html")など、New()を呼び出す必要はありません。
  • datastore.Timeが削除されています。go1beta以降では、time.Timeを利用すれば良いようです。
    • フォーマットを指定したい場合は、Format()が用意されていますので、書籍では、fmt.Sprintfを使って書式指定していましたが、go1betaでは、comments_view[pos].Date = comment.Date.Format("2006/01/02 15:04:05")という感じになります。
    • 以前書いたBlog記事(Goでの日付変換)も参考にして下さい。
  • datastore.SecondsToLocalTime()も削除されています。
    • datastore.Timeで管理する必要がなくなりますので、time.Timeで定義し、time.Now()で取得して下さい。