Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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配下では上記のような相対パスによるインポートは認められない。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away