特集のはじめに
Goは、
Goはシンプルな言語仕様であるため学習が比較的容易で、
本特集では、
なお、
言語の特徴
Goは、
以降ではGoの基本的な特徴を紹介します。
言語をシンプルに保つ
Goは、
最小限の構文
Goでは、
また、
危険の回避
メモリリークの原因となりやすいポインタ演算や、
また、
例外の排除
RubyやJavaなど例外をサポートする言語では、
特徴的な機能
Goは言語をシンプルに保つ一方で、
クロスコンパイルのサポート
Goは、
並行処理のサポート
Goでは、
充実した開発環境
Goでは開発を助けるさまざまなパッケージやツールが最初から用意されており、
標準パッケージ
Goは標準パッケージが充実しており、
標準パッケージの一覧は公式ドキュメントから確認できます。
パッケージ | 用途 |
---|---|
archive、 | tar、 |
crypto | AES、 |
database | RDBへのSQLクエリインタフェースとドライバインタフェース |
encoding | JSON、 |
go | Go言語自体のパーサやAST |
html、 | HTMLやTEXT形式のテンプレート |
net | TCP、 |
sync | 並行処理のためのロックや同期化のサポート |
testing | テストやベンチマークのサポート |
ツールのサポート
Goには開発を支援するコマンドが同梱されており、
コマンドの解説は公式ドキュメントから確認できます。
コマンド | 用途 |
---|---|
go build | プログラムのビルド |
go fmt | Goの規約に合わせてプログラムを整形 |
go get | 外部パッケージの取得 |
go install | プログラムのビルドとインストール |
go run | プログラムのビルドと実行 |
go test | テストやベンチマークの実行 |
go tool yacc | パーサをGoで出力するGo実装のyacc |
godoc | ソースからドキュメントの生成 |
各エディタのサポート
Goでは、
採用事例
GoのWikiには、
採用事例 | 説明 |
---|---|
Bazooka | SoundCloudで使われている社内PaaS https:// |
Docker | コンテナ型の仮想環境ツール。起動が早くポータビリティも高いためImmutable Infrastractureなどの流れと相まって急速に普及しつつある。 https:// |
hk | Herokuをコマンドラインから操作するためのツール。 https:// |
mackerel | はてなが提供するサーバ管理サービス。このエージェント部分にGoが採用されている。 https:// |
Packer | 仮想環境へのOSインストールや、 http:// |
peco | シェル用のフィルタリングツールであるpercolのGo実装。 https:// |
Vitess | GoogleがYouTubeのMySQLサーバをスケールさせるために開発したGo実装のミドルウェア。 https:// |
インストール
Goは、
インストールが完了したら、
$ go version
go version go1.3 darwin/amd64
hello world
まずはhello worldを作成して実行してみましょう。
作成
次の内容でhello.
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
実行
作成したプログラムをすぐに実行したい場合は、go run
コマンドを使用します。
$ go run hello.go
hello world
hello world
が出力されれば成功です。
コンパイル
次にこのプログラムをコンパイルして、go build
コマンドを使用します。
$ go build hello.go
$ ls
hello hello.go
$ ./hello
hello world
hello.
フォーマット
Goでは、
このコーディング規約はわざわざ覚える必要はありません。go fmt
コマンドを用いると、
$ go fmt hello.go
開発の際は、go fmt
が実行されるようにし、
ドキュメント
標準パッケージやサードパーティパッケージのドキュメントを確認するには、godoc
コマンドを使用します。たとえばhello.
$ godoc fmt
ブラウザから見る公式サイトと同様のインタフェースでドキュメントを確認したい場合は、-http
オプションを付けて実行します。
$ godoc -http=":3000"
サーバが起動し、http://
にアクセスするとドキュメントを見ることができます。
Goのプロジェクト構成とパッケージ
先ほどは1つのファイルにプログラムを記述しましたが、
ここでは、
ディレクトリの作成
まず、
$ tree myproject
myproject
├── bin # go install時の格納先
├── pkg # 依存パッケージのオブジェクトファイル
└── src # プログラムのソースコード
環境変数GOPATHの指定
次に、GOPATH
という環境変数に指定します。
$ cd myproject
$ export GOPATH=`pwd` # myprojectをGOPATHに登録
Goのコマンドは、GOPATH
とその下にある先の3つのディレクトリの命名規則を用いて、
パッケージの作成
そしてパッケージを作ります。Goでは、
gosampleパッケージ
まずgosampleパッケージを作ります。src/
を次のように作成します。
package gosample
var Message string = "hello world"
上記ではgosampleパッケージの中に、
mainパッケージ
次にmainパッケージを作ります。src/
を次のように作成します。
package main
import (
"fmt"
"gosample"
)
func main() {
fmt.Println(gosample.Message) // hello world
}
上記ではmain パッケージのmain()
の中で、GOPATH
から、$GOPATH/
と解決され実行されます。
ビルドと実行
実行
正しくGOPATH
が設定された状態でgo run
コマンドでmain.
$ cd $GOPATH/src/main
$ go run main.go
hello world
ビルド
次にこのプログラムをビルドして、go build
コマンドを用いてその場に実行ファイルを作ることもできますが、go install
コマンドを用いると、$GOPATH/
に自動的に格納されます。
$ cd $GOPATH/src/main
$ go install
ビルドしたあとのプロジェクト内は次のようになります。
$ tree myproject
myproject
├── bin
│ └── main
├── pkg
│ └── darwin_amd64
│ └── gosample.a
└── src
└── gosample
| └── gosample.go
└── main
└── main.go
このようにbinディレクトリに実行ファイルが生成されるため、$GOPATH/
をパスに追加しておけば、go install
したコマンドに常にパスを通すことができます。
$ export PATH=$PATH:$GOPATH/bin
$ main
hello world
パッケージの公開
作成したパッケージを公開してみましょう。といってもGo には、
先ほどのgosampleパッケージをGitHubで公開してみます。まずは空のリポジトリでよいので自分のGitHubにリポジトリを用意してください。ここではhttps://
にリポジトリを作成し、
ディレクトリ構造の修正
このリポジトリに合わせてディレクトリ構造を修正します。
$ tree myproject
myproject
├── bin
├── pkg
└── src
└── github.com
| └── wdpress
| └── gosample
| └── gosample.go
└── main
└── main.go
mainパッケージの修正
パッケージを使うmain.
package main
import (
"fmt"
"github.com/wdpress/gosample"
)
func main() {
fmt.Println(gosample.Message) // hello world
}
GitHubに公開
あとは、
$ cd $GOPATH/src/github.com/wdpress/gosample
$ git init
$ git add .
$ git commit -m 'my first golang package'
$ git remote add origin https://github.com/wdpress/gosample
$ git push origin master
これで公開が完了です。
公開したパッケージを使ってみる
では、
ローカルにあるパッケージを削除し、go get
コマンドを使います。
$ cd $GOPATH/src
$ rm -rf github.com
$ go get github.com/wdpress/gosample
取得したパッケージは、go get
で指定したパスと同じディレクトリ構成でプロジェクト内に展開されます。
再度main.
GOPATHを固定する
複数のプロジェクトがマシン内の別の個所にある場合は、GOPATH
を指定しなおす必要があります。その面倒を避けるため最近では、GOPATH
を指定し、
まとめ
本章では、