Files
2019-06-17 06:52:04 +09:00

177 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 1.2 GOPATHとワーキングディレクトリ
さきほどGoをインストールする際はGOPATH変数を設定する必要があるとご説明しました。Goはバージョン1.1から必ずこの変数を設定するようになっており、Goのインストールディレクトリと同じにはできません。このディレクトリは、GoのソースコードやGoの実行可能ファイル、並びにコンパイル済みのパッケージファイルを保存する為に使用します。そのためこのディレクトリにはつのサブディレクトリが存在しますsrc、bin、pkgです。
## GOPATH設定
go コマンドは、ある重要な環境変数に依存しています:$GOPATH<sup>1</sup>
Windowsシステムにおいて環境変数の形式は`%GOPATH%`です。この本の中では主にUnix形式を使用します。Windowsユーザは適時置き換えてください。
*これはGoのインストールディレクトリではありません。以下では筆者のワーキングディレクトリで説明します。もし異なるディレクトリを使用する場合はGOPATHをあなたのワーキングディレクトリに置き換えてください。*
Unix に似た環境であれば大体以下のような設定になります:
```sh
export GOPATH=/home/apple/mygo
```
上のディレクトリを新たに作成し、上の一行を`.bashrc`または`.zshrc`もしくは自分の`sh`の設定ファイルに加えます。
Windows では以下のように設定します。新しくGOPATHと呼ばれる環境変数を作成します
```sh
GOPATH=c:\mygo
```
GOPATHは複数のディレクトリを許容します。複数のディレクトリがある場合、デリミタに気をつけてください。複数のディレクトリがある場合Windowsはセミコロン、Linuxはコロンを使います。複数のGOPATHがある場合は、デフォルトでgo getの内容が第一ディレクトリとされます。
上の $GOPATH ディレクトリには3つのディレクトリがあります:
- src にはソースコードを保存します(例えば:.go .c .h .s等
- pkg にはコンパイル後に生成されるファイル(例えば:.a
- bin にはコンパイル後に生成される実行可能ファイル(このまま $PATH 変数に加えてもかまいません。もしいくつもgopathがある場合は、`${GOPATH//://bin:}/bin`を使って全てのbinディレクトリを追加してください
以降私はすべての例でmygoを私のgopathディレクトリとします。
## ソースコードディレクトリ構成
GOPATH内のsrcディレクトリはこれから開発するプログラムにとってメインとなるディレクトリです。全てのソースコードはこのディレクトリに置くことになります。一般的な方法では一つのプロジェクトが一つのディレクトリが割り当てられます、例えば$GOPATH/src/mymath はmymathというアプリケーションパッケージか実行アプリケーションになります。これはpackageがmainかそうでないかによって決定します。mainであれば実行可能アプリケーションで、そうでなければアプリケーションパッケージになります。これに関してはpackageを後ほどご紹介する予定です。
新しくアプリケーションやソースパッケージを作成するときは、srcディレクトリの中にディレクトリを作るところから始めます。ディレクトリ名は一般的にソースパッケージ名になります。もちろんネストしたディレクトリも可能です。例えばsrcの中に$GOPATH/src/github.com/astaxie/beedbというディレクトリを作ったとすると、このパッケージパスは"github.com/astaxie/beedb"になり、パッケージ名は最後のディレクトリであるbeedbになります。
以下ではmymathを例にどのようにアプリケーションパッケージをコーディングするかご説明します。以下のコードを実行します。
```sh
cd $GOPATH/src
mkdir mymath
```
sqrt.goというファイルを作成し、内容を以下のようにします。
```go
// $GOPATH/src/mymath/sqrt.goコードは以下の通り
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
```
このように私のアプリケーションパッケージディレクトリとコードが作成されました。注意一般的にpackageの名前とディレクトリ名は一致させるべきです。
## コンパイルアプリケーション
上のとおり、我々はすでに自分のアプリケーションパッケージを作成しましたが、どのようにコンパイル/インストールすべきでしょうか?2種類の方法が存在します。
1、対応するアプリケーションパッケージディレクトリに入り、`go install`を実行すればインストールできます。
2任意のディレクトリで以下のコード`go install mymath`を実行します。
インストールが終われば、以下のディレクトリに入り
```sh
cd $GOPATH/pkg/${GOOS}_${GOARCH}
//以下のファイルが現れるはずです。
mymath.a
```
この.aファイルはアプリケーションパッケージです。ならば我々はどのように実行できるでしょうか
次にアプリケーション・プログラムを作成してこのアプリケーションパッケージをコールします。
アプリケーションパッケージmathappを作ります。
```sh
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
```
`$GOPATH/src/mathapp/main.go`コード:
```go
package main
import (
"mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
```
このパッケージは`main`であることが分かると思います。importにおいてコールするパッケージは`mymath`であり、これが`$GOPATH/src`のパスに対応します。もしネストしたディレクトリであれば、importの中でネストしたディレクトリをインポートします。例えばいくつものGOPATHがあった場合も同じで、Goは自動的に複数の`$GOPATH/src`の中から探し出します。
さて、どのようにプログラムをコンパイルするのでしょうか?このアプリケーションディレクトリに入り、`go build`を実行すれば、このディレクトリの下にmathappの実行可能ファイルが生成されます。
```sh
./mathapp
```
以下のように出力されます。
```sh
Hello, world. Sqrt(2) = 1.414213562373095
```
どのようにアプリケーションをインストールするのでしょうか。このディレクトリに入り、`go install`を実行すると、$GOPATH/bin/の下に実行可能ファイルmathappが作成されます。`$GOPATH/bin`が我々のPATHに追加されていることを思い出して下さい、コマンドラインから以下のように入力することで実行することができます。
```sh
mathapp
```
この場合も以下のように出力されます。
Hello, world. Sqrt(2) = 1.414213562373095
ここではどのように実行可能アプリケーションをコンパイル/インストールし、ディレクトリ構造を設計するかについてご紹介しました。
## リモートパッケージの取得
go言語はリモートパッケージを取得するツール`go get`を持っています。現在go getは多数のオープンソースリポジトリをサポートしていますGitHub、googlecode、bitbucket、Launchpad
go get github.com/astaxie/beedb
>go get -u オプションはパッケージの自動更新を行います。また、go get時に自動的に当該のパッケージの依存する他のサードパーティパッケージを取得します。
このコマンドでふさわしいコードを取得し、対応するオープンソースプラットホームに対し異なるソースコントロールツールを利用します。例えばGitHubではgit、googlecodeではhg。そのためこれらのコードを取得したい場合は、先に対応するソースコードコントロールツールをインストールしておく必要があります。
上述の方法で取得したコードはローカルの以下の場所に配置されます。
$GOPATH
src
|--github.com
|-astaxie
|-beedb
pkg
|--対応プラットフォーム
|-github.com
|--astaxie
|beedb.a
go getは以下のような手順を踏みます。まずはじめにソースコードツールでコードをsrcの下にcloneします。その後`go install`を実行します。
コードの中でリモートパッケージが使用される場合、単純にローカルのパッケージと同じように頭のimportに対応するパスを添えるだけです。
import "github.com/astaxie/beedb"
## プログラムの全体構成
上記で作成したローカルのmygoのディレクトリ構造は以下のようになっています。
bin/
mathapp
pkg/
プラットフォーム名/ 例darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
上述の構成から明確に判断できるのは、binディレクトリの下にコンパイル後の実行可能ファイルが保存され、pkgの下に関数パッケージが保存され、srcの下にアプリケーションのソースコードが保存されているということです。
## links
* [目次](<preface.md>)
* 前へ: [GOのインストール](<01.1.md>)
* 次へ: [GOのコマンド](<01.3.md>)