Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

Goのチュートリアルをやる(1)

仕事でMarkdownっぽいフォーマットで議事録を書くと、ダサいフォーマットのHTMLに変換するスクリプトRubyで書いたら、gem installがsudoでしか出来ないと言われ、悲しんだ。

実行ファイルを作って配るのがやはり楽かもしれない。Rustでやろうかとも思ったけど、これを機にちょっとGoを触ってみることにする。 インストールはいつものようにbrew install goで。GOPATHやGOROOTは特に設定しろと言われなかったので、このままいってみる。

では、さっそくチュートリアル。日本語もあって嬉しい。

tour.golang.org

最初にページに書いてあるHello Worldを書いてみる。しかし、コンパイル方法が書いてない(笑)。

> pwd
/Users/tambara/study/go_study
> ls
hello.go
> cat hello.go 
package main

import "fmt"

func main(){
    fmt.Println("Hello, 世界")
}

goとだけ打つとUsageが出るので、それをみて、適当にgo buildしてみる

> go build
> ls -l
total 4128
-rwxr-xr-x  1 tambara  staff  2108040  3 31 09:52 go_study
-rw-r--r--@ 1 tambara  staff       76  3 31 08:54 hello.go
> ./go_study
Hello, 世界

実行ファイルできた。

> go clean
> ls 
hello.go

cleanで消えた。

そういえば、Rustではcargo runしたなと思い出し、runしてみる。

> go run
go run: no go files listed

なんか設定ファイルっぽいものが必要な様子。まあ、わからんでもない。気にせず進むことにする。

  • welcome
  • basics
  • flowcontrol

は特に問題なく進んだ。以下、ちょっと面白かったところ。

変数宣言

初期化しない変数宣言にはvarがいる。初期化がある場合には、

var i int = 1
var j = 2

としてもいいけど

i := 1

が簡潔で好まれるみたい。

制御構造

switch with no condition

switchで、条件を省略すると暗黙のtrueが置かれるというのは面白い。 というか、その場合は条件と値が逆の取扱になる。 かけ算の順序に厳しい小学校では烈火のごとく怒られそうだ(笑)。

以下のようにすると、最初にtrueになるcondの部分が実行される

switch {
case cond1:
    // cond1がtrueなら実行
case cond2:
    // cond1がfalse, cond2がtrueなら実行
default:
    // どちらもfalseなら実行
}

そういえば、何が真偽値になるのかの話はまだ読んでなかった。

Defer

関数の遅延評価。引数は渡した時点で評価されるが、関数の中身はreturnするまで評価されない。

var gs = "ぐろーばる"

func hoge(s string) {
    fmt.Println(gs + s)
}

func main(){
    s := "ろーかる"
    defer hoge(s)

    gs = "グローバル"
    s = "ローカル"
}

"グローバルろーかる"が返る。複数回deferするとスタックに積まれる。