包丁一本さらしに巻いて

Golangへの道 #1

ちょっと書いてみたくなった。

目標

  • VimでGolang書けるように環境を設定する(一旦ライブラリ管理等のベストプラクティスは無視)
  • Golangの基礎基本を覚える
  • 最終的にGETリクエストに対して何かJSON返すサーバーを作る

前提

  • 環境はMac OS X 10.9.4。homebrewインストール済み
  • 学習者はPython歴9ヶ月、ポインタに関する理解はポインタ演算手前まで
  • 学習者は平行/並列処理の知識無し

インストール

既に入ってるのでアップグレード。

$ brew upgrade go 
==> Upgrading 1 outdated package, with result:
go 1.2.2
==> Upgrading go
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/go-1.2.2.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.2.2.mavericks.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get code.google.com/p/go.tools/cmd/godoc
  go get code.google.com/p/go.tools/cmd/vet

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libex

インストール後の確認

$ go version
go version go1.2.2 darwin/amd64

Vim Plugin

ざっと見てコレが一番良さそうだったので入れる。

https://github.com/fatih/vim-go

以下の設定を.zshrcに入れる

#for golang
export GOPATH=$HOME/.go
export GOROOT=$( go env GOROOT )
export PATH=$GOPATH/bin:$PATH

.vimrcに以下を追加。

set rtp+=$GOROOT/misc/vim
exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim”)

vim開くと色々インストールされる

vim-go: gocode not found. Installing github.com/nsf/gocode to folder /Users/achiku/.vim-go/
vim-go: goimports not found. Installing code.google.com/p/go.tools/cmd/goimports to folder /Users/achiku/.vim-go/
vim-go: godef not found. Installing code.google.com/p/rog-go/exp/cmd/godef to folder /Users/achiku/.vim-go/
vim-go: oracle not found. Installing code.google.com/p/go.tools/cmd/oracle to folder /Users/achiku/.vim-go/
vim-go: golint not found. Installing github.com/golang/lint/golint to folder /Users/achiku/.vim-go/
vim-go: errcheck not found. Installing github.com/kisielk/errcheck to folder /Users/achiku/.vim-go/
vim-go: gotags not found. Installing github.com/jstemmer/gotags to folder /Users/achiku/.vim-go/

おなじみのHello, Worldからはじまる。

package main

import "fmt"

func main() {
    fmt.Printf("Hello, World!\n")
}

Vimで編集してて、import “fmt"書いた後に:wでファイル保存したらその部分だけ削除されて、なんじゃこりゃってなってたけど、どうやら先ほど入れたVimプラグインが使ってるパッケージを自動検出してソースをフォーマットしてくれているらしい。逆にimport文ナシで上のソースを書いて保存したらimport “fmt"の部分は自動で追記された。IDEみたい。

書いた後に、:GoBuildでビルド。:GoRunでビルドして実行。便利。

おまけ

Pythonに比べるとカッコが多い気がするので以下のVimプラグインを入れておく事をオススメ。設定はデフォルトでも十分。

https://github.com/jiangmiao/auto-pairs

と思ったけど、自分が常用しているKaoriya-vimの日本語入力(インサートモードから抜けた時のIMEモードを記録しておく設定)とかち合うので以下にした。数時間しか使っていないがauto-pairsの方が高機能なイメージ(関数書いた後に{}を書いて改行すると自動的にカーソルがいい感じの位置に来たり、等)。

https://github.com/Raimondi/delimitMate

基礎基本

とりあえず以下を全部写経して覚える。

https://gobyexample.com/

まだ全部は終わってないけど、channelまでは比較的サクサク進む。

https://github.com/achiku/syakyou/tree/master/golang/gobyexample

Golangっぽいところ1

先述のGo By Example、goroutine、channel、selectあたりからGolangっぽいところが出てくる気がする。自分自身平行/並列処理系はまったく分かってないので、多分この辺りを読んで実際書いていかないと難しい。

Go の並行処理

あとエラーの扱い方もJavaやPythonのExceptionに慣れている身からすると面白かった。Golangに関しての記述はなかったけど、「エラーハンドリング」という領域に関しては「コーディングを支える技術」で語られていたので再度読み直したいと思う。

Golangっぽいところ2

型、型推論が非常に便利な気がする。どこか小さく領域を見つけて実戦に投入してみようと決意した。

新しい言語を学ぶということに関して

新しい言語を学ぶ際は、「やりたい事も挙動も確定している何か」ってのを題材に、ガッツリ作るのがやっぱりいい気がする。言語を使う事だけに集中できる。Vの方はRFCを何個か暗記してるからソレを実装するって言ってたし、「コーディングを支える技術」には新言語を学ぶときは特定のアルゴリズムを新しい言語で実装する、という事が書いてあった。

まぁ、どちらもバケモノなので、自分は自分に合った何かを探そうと思います。