はじめに
こんにちは、Python界の情弱です。諸々の事情から、やっぱりGoくらいやっとかないとまずいんじゃねーの?という雰囲気を感じているのでひと通りやってみます。
ビルド
まず、ソースを取ってくる前に、環境変数の設定などをします。適当にやってて、GOROOTがコードベースのルートで、Goではコードベースとインストールターゲットを分けるようなことは考えてない雰囲気。トリッキーすぎるだろと。でもgodocのことを考えると仕方ない、という話もあります。
$ export GOROOT=/opt/go/goroot $ export GOBIN=$GOROOT/bin $ export GOOS=darwin $ export GOARCH=amd64 $ export PATH=$GOBIN:$PATH
環境変数が設定されていることを確認したら、ビルドします。
$ cd /opt/go $ hg clone -u release https://code.google.com/p/go goroot $ cd goroot/src $ ./all.bash
Emacsの設定
go/misc/emacsにgo-mode.elというのがあるのでこの設定をします。go-mode-load.elには単純に設定が書いてあります。
(autoload 'go-mode "go-mode" "Go language mode" t) (setq auto-mode-alist (cons '("\\.go$" . go-mode) auto-mode-alist)) (add-hook 'go-mode-hook '(lambda() (c-set-style "python") (setq c-basic-offset 4) (setq indent-tabs-mode nil)))
Hello World
とりあえず脳みそ停止させて、何も考えずにHello World走らせてみる。
- test.go
package main import "fmt" func main() { fmt.Printf("hello, world\n") }
これをrunコマンドで実行。
$ go run test.go hello, world
gotourのインストール
あとは基礎をやるためにgo-tourをローカルにインストールして、実行してみる。
$ go get code.google.com/p/go-tour/gotour $ gotour 2012/07/11 18:23:08 Serving content from /opt/go/goroot/src/pkg/code.google.com/p/go-tour 2012/07/11 18:23:08 Open your web browser and visit http://127.0.0.1:3999/
ブラウザでアクセスしてみると
gotourの演習問題をやってみる
- #44
package main import ( "fmt" "math" ) func Sqrt(x float64) float64 { z := 1.0 delta := z for delta > 0.001 { new_z := z - (z*z - x) / 2*z delta = new_z - z z = new_z } return z } func main() { fmt.Println(Sqrt(2), math.Sqrt(2)) }
- #45
package main import ( "code.google.com/p/go-tour/wc" "strings" ) func WordCount(s string) map[string]int { words := strings.Fields(s) accu := make(map[string]int) for i := 0; i < len(words); i++ { accu[words[i]]++ } return accu } func main() { wc.Test(WordCount) }
- #46
package main import "code.google.com/p/go-tour/pic" func Pic(dx, dy int) [][]uint8 { pic := make([][]uint8, dy) for y := 0; y < dy; y++ { picy := make([]uint8, dx) for x := 0; x < dx; x++ { picy[x] = uint8(x % 255) } pic[y] = picy } return pic } func main() { pic.Show(Pic) }
- #47
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { return calc_fib } var i, n1, n2 int = 1, 1, 1 func calc_fib() int { if i == 1 { i++ return n2 } i++ n1, n2 = n1 + n2, n1 return n2 } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }
- #48
package main import ( "fmt" "math/cmplx" ) func Cbrt(x complex128) complex128 { z := complex128(1) for i := 0; i < 10000000; i++ { z = z - (z*z*z - x) / 3*z*z } return z } func main() { fmt.Println(Cbrt(2), cmplx.Pow(2, 0.33333333)) }
gotourみたいなの、他の言語でもあれば便利だな。ローカルで出来るのが良い。ところで、#48の解答はどうも納得行かない。これでいいの?