YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

Goのセットアップをする

はじめに

こんにちは、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/

ブラウザでアクセスしてみると
f:id:ymotongpoo:20120711182408p:plain

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の解答はどうも納得行かない。これでいいの?