仕事でMarkdownっぽいフォーマットで議事録を書くと、ダサいフォーマットのHTMLに変換するスクリプトをRubyで書いたら、gem installがsudoでしか出来ないと言われ、悲しんだ。
実行ファイルを作って配るのがやはり楽かもしれない。Rustでやろうかとも思ったけど、これを機にちょっとGoを触ってみることにする。
インストールはいつものようにbrew install go
で。GOPATHやGOROOTは特に設定しろと言われなかったので、このままいってみる。
では、さっそくチュートリアル。日本語もあって嬉しい。
最初にページに書いてある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するとスタックに積まれる。