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()と書いているけれど、このmailがgithub.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
_(アンダースコア)を付けるのは知っていましたが、それ以外は知りませんでした。
まだまだ勉強が足りません。