Goを試す

Googleが開発したと話題のGoを試してみる企画。もういろんな人が既にやってるので、すっかり出遅れてる感があるけれど、自分のためのメモとして。
自分のためのメモって言ったって、Getting Started - The Go Programming Languageに書いてあるとおりにやるだけなんだけれど。
というわけで、Fedora 11とCygwinで試してみることに。

まず、mercurialをインストールする。Fedora 11の場合は、こんな感じ。

 % sudo yum install mercurial

Cygwinの場合は、setup.exeで目を皿のようにして探すとmercurialがパッケージとしてダウンロード可能になっているはず。


環境変数を適切に設定する。

 % export GOROOT=$HOME/go
 % export GOARCH=386
 % export GOOS=linux

ちなみに、mkdir $HOME/go と mkdir $HOME/bin をした上で、export PATH=$PATH:$HOME/bin もしてある。Cygwinの場合も、GOOSにはlinuxをセットしておく。

次にダウンロードを実行。Getting Started - The Go Programming Languageの中に、tar.gzへのリンクが張ってあるのかと思って、lynx -dump http://golang.org/doc/install.html|grep tar.gz とかやった上で、あれ?どうやってダウンロードするんだろうって最初に悩んだのは内緒だ。

 hg clone -r release https://go.googlecode.com/hg/ $GOROOT

次にbuildする。以降は、Fedora 11で試した結果だ*1

 % cd $GOROOT/src
 % ./all.bash

buildして、testして、installまでしてくれるようだが、testでひっかかる。

 rm -f _test/http.a
 gopack grc _test/http.a _gotest_.8 
 make[2]: Leaving directory `/home/fukuit/go/src/pkg/http'
 --- FAIL: http.TestClient
         Get http://www.google.com/robots.txt: dial tcp www.google.com:http: lookup www.google.com. on xxx.xxx.xxx.xxx:53: no such host
 --- FAIL: http.TestRedirect
         Get http://codesearch.google.com/: dial tcp codesearch.google.com:http: lookup codesearch.google.com. on xxx.xxx.xxx.xxx:53: no such host
 FAIL
 make[1]: *** [test] エラー 1
 make[1]: ディレクトリ `/home/fukuit/go/src/pkg/http' から出ます
 make: *** [http.test] エラー 2

とりあえず、問題を起こしているのは、request_test.goという117行のコードだということは分かるが、いかんせん中身を見ても何がどうなっているのか良く分からない。とはいえ、これはtestコードだし、原因はproxyだろうと当たりをつけた上で、環境変数http_proxyを設定していてもダメだと分かった時点で、それ以上の追及は終了。このテストを回避するという後ろ向きな解決方法を採用することにする。
$GOROOT/src/pkg/http/Makefile を見ても、TESTに関する記述はないので、その一個上の階層の$GOROOT/src/pkg/Makefileを見てみる。すると、101行目に「NOTEST」という記述があるので、ここにhttpを追記した上で、./all.bashを再実行すると、今度は違うエラーが出る。

 --- FAIL: net.TestTimeoutTCP
         dial tcp 74.125.19.99:80 failed: dial tcp 74.125.19.99:80: no route to host
         fd.Read on tcp 74.125.19.99:80 did not return 0, EAGAIN: 0, invalid argument
         fd.Read on tcp 74.125.19.99:80 took 0.000002 seconds, expected 0.1
 FAIL

同様に、$GOROOT/src/pkg/MakefileのNOTESTにnetを追記して、./all.bashを再々実行。今度は、無事終了した。
というワケで、ひとまず、$GOROOT/src/pkg/Makefileの修正点はこんな感じ。

 % diff -c Makefile Makefile.orig
 *** Makefile    Mon Nov 16 13:11:41 2009
 --- Makefile.orig       Mon Nov 16 13:09:46 2009
 ***************
 *** 104,113 ****
         go/doc\
         go/token\
         hash\
 -       http\
         image\
         malloc\
 -       net\
         rand\
         runtime\
         syscall\
 --- 104,111 ----
 %

サンプルプログラムの実行

何はなくともhello worldから。Getting Started - The Go Programming Languageに載ってる、そのまま。(さすがに今日時点では、はてな記法もGoには対応してないらしい)

 package main
 import "fmt"
 func main() {
 	fmt.Printf("hello world\n")
 }

これだけ見ても、この言語の特徴はよく分からないけれど、やっぱり、たかだかhello worldの出力くらいで、fmt.Printf()とか書く必要があるあたり、いろんなFrameworkとかlibraryとかが用意されてる(あるいはこれから用意される)んだろうな、と感じさせる。行末の「;」は不要らしい。rubyで慣れてるとはいえ、なんか、ちょっと落ち着かない気分なのも事実。

 % 8g hello.go
 % 8l hello.8
 % ./8.out
 hello world
 % 

Cygwinでbuildする時に起きたエラー

とりあえず書いておくけど、Cygwinでbuild中には、こんなエラーになった。

 quietgcc -ggdb -I/home/fukui/go/include -O2 -fno-inline -c /home/fukui/go/src/lib9/jmp.c
 /home/fukuit/go/src/lib9/jmp.c:33: error: invalid lvalue in unary `&'
 /home/fukuit/go/src/lib9/jmp.c:40: error: invalid lvalue in unary `&'
 quietgcc -ggdb -I/home/fukui/go/include -O2 -fno-inline -c /home/fukui/go/src/lib9/main.c
 make: *** [jmp.o] Error 1
 make: INTERNAL: Exiting with 5 jobserver tokens available; should be 4!

どうやら、siglongjmpという関数に渡してる引数に問題があるようだが、、、。Fedora 11では、ここはエラーになってない。CygwinFedora 11で、まず違うのはgccのバージョン。Cygwinではgcc-3.4.4を使っているが、Fedora 11では、gcc-4.4.1を使っている。export CC=gcc-4してからcygwin上で./all.bashを実行しても、同じエラーが出て先に進めなかった。

*1:cygwinではlib9のcompile時にerrorが出て、素人のオレには対処できかねる