ふと疑問に
Goではパッケージパスの最後の要素は配下の(goファイルの)パッケージ名と同じにするのが慣例だが「異なっていてもよい」のでしょうか?
では確認を
パスツリー
$GOPATH/
+--src/
+--japan/
+--main.go
+--area/
+--chugoku.go
変更前:パッケージパスの最後の要素とパッケージ名が同じ
最後の要素:area
パッケージ名:area
area/chugoku.go
// パッケージ名:area
package area
import "fmt"
func Okayama() {
fmt.Println("ピーチ")
}
main.go
package main
import (
// パッケージパスの最後の要素:area
"japan/area"
)
func main() {
// パッケージ名:area
area.Okayama()
}
実行結果
$ go run main.go
ピーチ
変更後:パッケージパスの最後の要素とパッケージ名が異なる
最後の要素:area
パッケージ名:chugoku
area/chugoku.go
// パッケージ名:area -> chukoku
package chugoku
import "fmt"
func Okayama() {
fmt.Println("ピーチ")
}
main.go
package main
import (
// パッケージパスの最後の要素:変更なし
"japan/area"
)
func main() {
// パッケージ名:area -> chugoku
chugoku.Okayama()
}
実行結果
$ go run main.go
ピーチ
結論としては
import文ではパッケージでなくパス名(文字列なのも納得)を指定しているため、パッケージパスの最後の要素は配下の(goファイルの)パッケージ名と「異なっていてもよい」です。
直近で見ていた mackerel-agent-plugins でも使われていました。