【helloworld編】ねこでもわかるGo言語

Photo by google

Go言語を勉強し始めたので、コンソールとブラウザ(GAE利用)に作法通り helloworld を表示するまでをやります。

Go言語とは何?

Go言語は Google が開発しているシステムプログラミング言語です。

2009年の発表された GO言語 ですが、C言語が登場したのが1972年ですからまだ新生児みたいな言語です。
組み込み系やインフラシステムなどは C/C++言語 で書かれていますが、Cのマルチスレッドプログラミングはメモリ管理のしづらさがあります。現在はマルチコアCPUが一般な時代になってきたこともあり、並列処理の得意な言語が注目されてきています。

GO言語も Goroutine という並行処理の機能をもっています。

  • コンパイル言語だけど動的プログラミング言語のような記述
  • Goroutineによる並行化(軽量/メモリ共有)
  • ガベージコレクション

ちなみに同名の言語(Go!)はすでにあって、今後は別名になることもありそうです。

個人的には、高度な機能を持った組み込みソフト開発のスタンダードな言語となって欲しいです。
組み込み分野ではスイッチ入れたら10年間動き続けるというマシンもあります。たとえ微小なメモリリークでも致命的になり兼ねないです。CにGCがあればと思いますが、それだとCの利点が削られてしまいます。
Goが組み込みソフトでも使えるくらい広まってほしいです。

開発環境構築

今回の開発環境はMac OS X 10.7.4です。(Python 2.7.1)

ブラウザでGoを実行するのにPythonのインストールが必要です。Mac OS Xでは最初から入ってますが,入っていない環境の人はインストールしてください。
GAE for Go
DLして任意の場所に展開します。次に Python と GAE for Go の Path を通します。

export PATH=/usr/bin/python:$PATH
export PATH=$HOME/go_appengine_sdk_darwin_386-1.7.0/google_appengine:$PATH

これらの環境変数の設定ファイルは通常 Finder に表示されません。ls -aで確認しましょう。 環境変数を読み直します。

$ source .bash_profile

念のため環境変数を確認します。

$ echo $PATH
$ python -V

ちなみに go の Syntax Highlight ですが、Mac環境なら XCode とか Vim のプラグインがあります。

Goで helloworld

初めにテキストエディターで helloworld.go を作成します。(UTF-8)

package main

import "fmt"

func main() {
    fmt.Printf("helloworld\n")
}

package宣言は、このプログラムがどのパッケージに従うかの宣言です。
続いて、import “fmt”ですが、fmtという簡単な I/O を行うことができるパッケージを呼び出しています。
Cでいう stdio に近い役割で printf や scanf関数を提供します。C同様、初めに実行されるのが main() です。

ターミナルを開き goツール で作成したファイルを実行します。

# case : build  & exec
$ go build helloworld.go
$ ./helloworld
# case :run
$ go run helloworld.go
helloworld

helloworldと表示されると思います。続いて、GoogleAppEngine for Go でローカルサーバを立ち上げてブラウザ上に helloworld を表示させます。

ブラウザでhelloworld

GAE for Go をダウンロードすると、中に Demoファイル が入っています。
これを使ってブラウザに helloworld を表示させます。

app.yamlは設定ファイルです。 XMLより人間に読みやすくしたデータ記法らしいです。JSONと異なりファイルを全て読む前に Parse を開始できます。

application: helloworld
version: 1
runtime: go
api_version: go1

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /.*
  script: _go_app

application:アプリの識別子
version:アプリのヴァージョン
runtime:Goで動かすという宣言
api_version:ランタイムのヴァージョン
handlers url : Requestに対する処理を宣言

続いて helloworld.go を編集します。
importに “net/http” が追加されています。netがTCP/IP、UDP、ドメイン名解決、UNIXドメインソケットを含むUnixネットワークソケットのパッケージを提供します。

package helloworld

import (
	"fmt"
	"net/http"
)

func init() {
	http.HandleFunc("/", handle)
}

func handle(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "helloworld")
}

ローカルサーバを立ち上げます。ディレクトリに注意して下さい。

$ dev_appserver.py helloworld/

ブラウザを立ち上げてhttps://localhost:8080/にアクセスし、helloworldと表示されたら成功です。

GAEはCPU従量課金ですから、速いGoはスクリプト言語よりお得です。 次回は Go の大きな特徴である goroutine などについて書きます。