私の問題は次のようなものです。他のパッケージMyMail
に機能SendMail(MyMail.Mail)
を提供するパッケージがあります。MyMail
パッケージLowLevelMail
とその関数Send(LowLevelMail.Mail)
を使用して、実際にメールを送信します。これらは、「同じ構造体」(つまり、同じ名前と型のフィールド) を定義するという意味で同一ですMyMail.Mail
。LowLevelMail.Mail
SendMail(m MyMail.Mail)
m
を使用するLowLevelMail.Mail
前に に変換する必要がありSend(LowLevelMail.Mail
ます。newmail := LowLevelMail.Mail(m)
動作しません。ただし、コンパイラは 2 つの構造体のフィールドが同一であることを確認できる必要があるため、これは可能です。エクスポートされたフィールドがないため、これをサポートすることはお勧めできません。
1)手動ですべてを実行せずに(そしてすべての型の安全性を失わずに)どうにかして割り当てることはできますm
かnewmail
? 手作業による方法では、多少の苦痛が生じます (構造体は、他の構造体に割り当てることができる単純な型だけで構成されているわけではありません)。
2)問題全体に対するより良い解決策はありますか(つまり、「パッケージのクライアントを外部APIに依存させたくないので、APIで他のパッケージのタイプを使用したくありません。この外部APIは変更される可能性があります。または、ある時点でもう使用しないことにするかもしれません。」)
更新:重要な点を見逃していました: asで「再定義」されているLowLevelMail.Mail
type のフィールドがあります。LowLevelMail.Address
MyMail
MyMail.Address