TL;DR
Go Version 1.11からのGo Modules(vgo)を使うならば__importにて相対パスは使用不可なので絶対パスを指定しよう__。
簡単な具体例
以下のような構成のGo Modules対応のプロジェクトがあるとします。
$ tree
.
├── go.mod
├── go.sum
├── main.go
├── subdir
│ └── subdir.go
go.mod
, subdir.go
, main.go
は以下のような内容。
module github.com/username/repo-name
require (
...
package subdir
func SubDirFunc() {
...
package main
import (
"github.com/username/repo-name/subdir" // go.mod記載のモジュール名で絶対パス指定すること
// NG "./subdir" // 相対パスは使用不可
)
...
main.go
でのコメントのように、 ./subdir
と指定してもコンパイル時に
cannot find module
となりGoはPathを見つけることができません。
go.mod
に指定しているモジュール名を用いて絶対パス指定しましょう。
また、相対パス利用の既存コードはGo Modulesに乗り換えたら相対パスimport部を修正する必要があります。
設計者の解説
Go ModulesのデザインをリードしたRuss Cox氏がこちらのIssueのコメントでこのようになった経緯を解説してくれています。
要約すると
相対パスimportはGoコマンドとGOPATHがまだ無い時代に利用されていた。
↓
GOPATHが採用された後、GOPATH内では絶対パス指定(fully-qualified path)推奨、GOPATH外では相対パス指定するしかない(しかしビルドキャッシュが無かったのでビルドが遅かった)。
↓
Go Modulesでは相対パスか絶対パスのどちらかしか選択できない状況となった。マジョリティをサポートするために絶対パスコードの互換性保証を選んだ。