Go
Go3Day 8

Goのパッケージパスとパッケージ名は異なってもよいか?

ふと疑問に

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 でも使われていました。