IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

早速 Go 言語を試してみる!

はじめに

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
ソースコード取得

mercurial リポジトリからチェックアウトしてくる

amacbook% hg clone -r release https://go.googlecode.com/hg/ $GOROOT 
ビルド
amacbook% cd $GOROOT/src 
amacbook% ./make.bash 

完了!(run.bash は HTTP のテストで失敗したので、やっていない)

$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 おなじみの記法ですねー。