Google go で遊んでみた

goで遊んでみたよ!

インストール

Installing Go
にあるとおりにすれば問題なくインストールできた。

環境変数を準備

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

Mercurial(入ってなければ適宜インストールする)でソースをチェックアウト

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

ビルド

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

試す

ざーっとドキュメントを見た感じ、C+GC+軽量プロセス的な言語。コンパイル&リンクするとネイティブコードを吐き出す。
よーくドキュメントを見るとクロージャもあることが分かる。

package main

import "fmt";

func map_array(f func(int) int, array []int) []int {
    num := len(array);
    ret := make([]int, num);
    for i := 0; i<num; i++ {
        ret[i] = f(array[i]);
    }
    return ret;
}

func dump(i int) int{
    fmt.Printf("[%d]\n", i);
    return i;
}

func main() {
    array := []int{1, 2, 3};
    num := 1;
    map_array(
            dump,
            map_array(
                //インラインで関数オブジェクトを作り出せる。
                func(x int) int { num++; return x * num; },
                array ));
    dump(num);
}

$ make run
8g hoge.go
8l hoge.8
./8.out
[2]
[6]
[12]
[4]
$

ただ、ジェネリクスとかはなく(interfaceを使って似たようなことはできる)、総称的なコンテナとかいわゆる関数型言語的なmap関数とかを作るのはちょっと面倒。実際、組み込みのcontainer/vectorパッケージにはIntVectorとかStringVectorとかそんなパッケージがあってがっかりする。
肝はたぶん軽量プロセスじゃないかと思う。そっちはまだ触ってない。