追記
コメントにて指摘いただきました。go mod
コマンドを用いると、go mod init モジュール名
で指定したモジュールからインポートできることが確認できました。
$ go mod init hoge
---main.go
package main
import "hoge/sample"
|
(省略)
---
これで動くと思います。
Goにて開発をしていて、ファイルを用いてパッケージを分けようとしたら起きたエラー。
とりあえず解決したので、すぐさまメモ。。。
環境
バージョン
go version go1.13.14 linux/amd64
centos 7
ディレクトリ構造
./
|
|--sample/
| |
| |--sample.go
|
|--main.go
実際のコード
main.go
package main
import "./sample"
func main() {
a := sample.Foo("test")
sample.PrintFoo(a)
}
sample.go
package sample
import "fmt"
func Foo(s string) string {
return "aaa " + s + " bbb"
}
func PrintFoo(s string) {
fmt.Println(s)
}
[root@marny ---]# go build -o practice
unexpected directory layout:
import path: _/develop/go/src/test/marny/sample
root: /develop/go/src
dir: /develop/go/src/test/marny/sample
expand root: /develop/go
expand dir: /develop/go/src/test/marny/sample
separator: /
どういったエラーなのか
unexpected directory layout:
というエラーは、どうやらimportしているパッケージのパスの指定がダメですよーというエラーらしい。
僕自身、centos7(vbox)にsambaでwindowsとつなげて編集していたので、ソースコード上でのエラーはありませんでした、、、、
解決
僕の場合、$GOPATHを/develop/go
と指定しています。GOPATHの仕様で、binやらsrcやらを生成して、Goの開発をするのですが、ここでエラーが起きている。
どうすれば解決するか、というと、main.goのimport./sample
を$GOPATH/src
から見た相対パスに変更すれば、解決します。
よって、
main.go
package main
import "test/marny/sample"
func main() {
a := sample.Foo("test")
sample.PrintFoo(a)
}
これで、解決すると思います。
GOPATHめんどくさいね。