# 1.2 GOPATHとワーキングディレクトリ

## GOPATH設定
  go コマンドには重要な環境変数があります：$GOPATH<sup>1</sup>

  *（注：これはGoのインストールディレクトリではありません。以下では筆者のワーキングディレクトリで説明します。ご自身のマシン上のワーキングディレクトリに置き換えてください。）*

  Unix に似た環境であれば大体以下のような設定になります：
```sh
	export GOPATH=/home/apple/mygo
```
  上のディレクトリを新たに作成し、上の一行を`.bashrc`または`.zshrc`もしくは自分の`sh`の設定ファイルに加えます。

  Windows では以下のように設定します。新しくGOPATHと呼ばれる環境変数を作成します：
```sh
	GOPATH=c:\mygo
```
GOPATHは複数のディレクトリを許容します。複数のディレクトリがある場合、デリミタに気をつけてください。複数のディレクトリがある場合Windowsはセミコロン、Linuxはコロンを使います。複数のGOPATHがある場合は、デフォルトでgo getの内容が第一ディレクトリとされます。


上の $GOPATH ディレクトリには３つのディレクトリがあります：

- src にはソースコードを保存します（例えば：.go .c .h .s等）
- pkg にはコンパイル後に生成されるファイル（例えば：.a）
- bin にはコンパイル後に生成される実行可能ファイル（このまま $PATH 変数に加えてもかまいません。もしいくつもgopathがある場合は、`${GOPATH//://bin:}/bin`を使って全てのbinディレクトリを追加してください）

以降私はすべての例でmygoを私のgopathディレクトリとします。

## アプリケーションディレクトリ構成
パッケージとディレクトリの作成：$GOPATH/src/mymath/sqrt.go（パッケージ名："mymath"）

以後私が新規に作成するアプリケーションまたはコードパッケージはsrcディレクトリに新規ディレクトリを作成します。ディレクトリ名はほぼコードパッケージの名前です。当然ネストしたディレクトリもありえます、例えば、srcの下にディレクトリ $GOPATH/src/github.com/astaxie/beedbというようなディレクトリを作成すると、このパッケージのパスは"github.com/astaxie/beedb"になります。パッケージ名は最後のディレクトリであるbeedbです。

以下のコードを実行します。
```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の名前とディレクトリ名は一致させるべきです。

## コンパイルアプリケーション
上のとおり、我々はすでに自分のアプリケーションパッケージを作成しましたが、どのようにコンパイル/インストールすべきでしょうか？２種類の方法が存在します。

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))
	}
```
どのようにプログラムをコンパイルするのでしょうか？このアプリケーションディレクトリに入り、`go build`を実行すれば、このディレクトリの下にmathappの実行可能ファイルが生成されます。
```sh
	./mathapp
```
以下のように出力されます。
```sh
	Hello, world.  Sqrt(2) = 1.414213562373095
```
どのようにアプリケーションをインストールするのでしょうか。このディレクトリに入り、`go install`を実行します。すると、$GOPATH/bin/の下に実行可能ファイルmathappが作成されますので、コマンドラインから以下のように入力することで実行することができます。

	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の下にアプリケーションのソースコードが保存されているということです。

 - - -
[1] Windowsシステムの環境変数の形式は`%GOPATH%`です。本書では主にUnix形式を使いますので、Windowsユーザは適時自分の環境に置き換えてください。
## links
  * [目次](<preface.md>)
  * 前へ: [GOのインストール](<01.1.md>)
  * 次へ: [GOのコマンド](<01.3.md>)
