Go言語でパッケージの修飾名が重複した場合の対応方法

Go言語では有志による様々なパッケージが公開されていて、go getでダウンロードして簡単に使用することができます。

ただ、パッケージの名前はみなさん同じようなものをつけたりするのでビルド時にエラーになることがあります。

例えば以下のようなコードを書いた場合、

import (
    "bytes"
    "github.com/taknb2nch/go.net/mail"
    "log"
    "net/mail"
)

func main() {
    p := mail.NewPop3()
・・・
}

このようなエラーが発生します。

$ go run main.go
# command-line-arguments
.\main.go:10: mail redeclared as imported package name
        previous declaration at .\main.go:7
.\main.go:15: undefined: "net/mail".NewPop3

要は、「mailってパッケージが複数回宣言されているよ」ってことらしい。
Go言語ではあるパッケージに存在する型を使用する場合、パッケージ名.型と書きます。
上記のサンプルの場合、mail.NewPop3()と書いているけれど、このmailgithub.com/taknb2nch/go.net/mailのmailなのか、net/mailのmailなのか分からないってことらしい。


ではどうしたらいいのか、みな同じ所でハマるようです。
How to import and use different packages of the same name in Go language? - Stack Overflow


上記リンク先にも書かれていますが、簡単な方法としては以下のようにして別名を定義してあげればいいようです。

import (
    "bytes"
    mymail "github.com/taknb2nch/go.net/mail"
    "log"
    "net/mail"
)

func main() {
    p := mymail.NewPop3()
・・・
}


Goドキュメントにもそのあたりのことも書かれてありました。

Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import m "lib/math"         m.Sin
import . "lib/math"         Sin

The Go Programming Language Specification - The Go Programming Language
_(アンダースコア)を付けるのは知っていましたが、それ以外は知りませんでした。


まだまだ勉強が足りません。