LoginSignup
15
13

More than 5 years have passed since last update.

[備忘録]Go言語のGOPATHやパッケージについて

Posted at

すでにインターネット上に日本語の情報がいろいろありますが、自分用に備忘録として書き溜めておきます。

GOPATHって何?

詳しくは この記事 かgo helpを参照のこと。

$ go help gopath

外部からパッケージをビルドしたりインストールするのに必要。
go get を実行した際に参照され、 $GOPATH/src 以下にgetしたデータが入る。

例えば、以下のコマンドを実行すると、$GOPATH/src に golang.org/x/net/html のディレクトリができ、htmlパッケージに関連するデータが入る(ちなみに golang.org/x/net/html パッケージはHTMLのパースなどの機能をサポートするパッケージ)。

$ go get golang.org/x/net/html

$GOPATH が通っている箇所に入ったパッケージは、以下のようにgolangのソースファイルでインポートすることが可能。

import "golang.org/x/net/html"

GOPATHはどこに設定すれば良い?

どこでも良い。
調べた限りでは $HOME/go に設定している人が多そう。

$ export GOPATH=$HOME/go

GOPATHは複数指定できるの?

できる。ただし1つ目に指定したもの以外は無効な場合がある。

例として、以下のようにGOPATHを指定したとする。

$ export GOPATH=$HOME/go:$HOME/golang:$HOME/workspace/go

指定した全てのGOPATHが有効なのは、Goコンパイラが外部のパッケージを探す場合のみである。
つまり、import文で指定したパッケージはGOPATHが通っている箇所であればコンパイラが見つけることができる(コンパイルエラーにならない)。
$HOME/workspace/go/src 以下に配置したパッケージはインポートすることができる。

逆に1つ目のGOPATHしか有効にならないのは、go get により外部のパッケージをダウンロード・インストールする場合である。
go get コマンドを使用すると外部のパッケージは必ず1つ目に指定した $HOME/go にインストールされる。

ソースは以下。
そろそろ真面目に Golang 開発環境について考える — GOPATH 汚染問題

外部パッケージのインポートに相対パスを使っても良い?

import "./foo"
import "../bar/baz"

以下の理由により非推奨。

  • コンパイルのたびにパッケージ化するため、コンパイルが遅くなる
  • go getが使えない

ソースは以下。
Golangで自分自身で定義したパッケージをインポートする方法あれこれ

また、GOPATH配下では上記のような相対パスによるインポートは認められない。

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13