特集のはじめに
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/amd64hello world
まずはhello worldを作成して実行してみましょう。
作成
次の内容でhello.
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}実行
作成したプログラムをすぐに実行したい場合は、go runコマンドを使用します。
$ go run hello.go
hello worldhello worldが出力されれば成功です。
コンパイル
次にこのプログラムをコンパイルして、go buildコマンドを使用します。
$ go build hello.go
$ ls
hello hello.go
$ ./hello
hello worldhello.
フォーマット
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.gomainパッケージの修正
パッケージを使う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を指定し、
まとめ
本章では、