はじめに
Google から新プログラミング言語 The Go Programming Language が発表されましたね!
というわけで、さっそく試してみたいと思います。
環境は Mac OS X 10.6
インストール
さっそくインストール
Getting Started - The Go Programming Language を見ながら
環境の準備
ディレクトリを作る
amacbook% cd ~ amacbook% mkdir go amacbook% mkdir bin
環境変数の設定をする。~/.zshrc に以下を追加
# Go 用 export GOROOT=$HOME/go export GOOS=darwin export GOARCH=amd64 export GOBIN=$HOME/bin export PATH=$GOBIN:$PATH
Mercurial をインストール
amacbook% sudo port install mercurial
ソースコード取得
amacbook% hg clone -r release https://go.googlecode.com/hg/ $GOROOT
$GOBIN にインストールされたファイル
$ ls $GOBIN 6a 6c 6g 6l 6nm cgo ebnflint godefs godoc gofmt gopack gotest goyacc hgpatch quietgcc
Hello world を書いてみる
適当な作業用ディレクトリを作って
amacbook% mkdir -p ~/dev/go amacbook% cd ~/dev/go
hello.go ファイルを作成
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
コンパイル
6g コマンドでコンパイル
amacbook% 6g hello.go
こうすると hello.6 というオブジェクトファイルができる
6nm でオブジェクトのシンボルを見れる
amacbook% 6nm hello.6 : T main·main :
リンク
6l コマンドでリンク
amacbook% 6l hello.6
6.out が出来る(別名が良ければ -o オプション)
実行
amacbook% ./6.out hello, world amacbook%
おおおおおおおおおお
C 言語とのリンク 1
6c コマンドを使って c ファイルをコンパイルすれば 6l でリンクできるみたい
amacbook% 6c foo.c amacbook% 6g bar.c amacbook% 61 foo.6 bar.6
C 言語とのリンク 2
GCC の gccgo branch を使えば既存の C/C++ ライブラリもリンクできるみたい
Setting up and using gccgo - The Go Programming Language
twitter public_timeline を取得してみる
http.Get は何故か動かなかったので net.Dial を使った。
package main
import (
"json";
"bufio";
"io";
"net";
)
func main() {
if con, err := net.Dial("tcp", "", "twitter.com:80"); err == nil {
io.WriteString(con, "GET /statuses/public_timeline.json HTTP/1.1\r\n");
io.WriteString(con, "Host: twitter.com\r\n");
io.WriteString(con, "User-Agent: Hoge\r\n");
io.WriteString(con, "\r\n");
reader := bufio.NewReader(con);
for {
line, err := reader.ReadString('\n');
if err != nil {
if err.String() == "EOF" {
j, _, _ := json.StringToJson(line);
for i := 0; i < j.Len(); i++ {
data := j.Elem(i);
print(data.Get("user").Get("screen_name").String() + ": " + data.Get("text").String() + "\n");
}
}
break;
}
}
}
}json パーサーとかもついてて簡単!
goroutine がおもしろそう。。でも時間がないのでまた今度
ちょっと goroutine
やっぱり、ちょっとだけ goroutine を触ってみる
package main
func main() {
ch := make(chan int);
go func() {
// TODO something
ch <- 0;
}();
go func() {
// TODO something
ch <- 0;
}();
<-ch;
<-ch;
}Channel というものを使って上のようなコードのように書けば、簡単に二つの処理を同時に走らせたりできる。
func() { } () とかは、クロージャで JavaScript おなじみの記法ですねー。