go - 「構造同一」タイプの他の構造体への1つの構造体の割り当て

go

私の問題は次のとおりです。他のパッケージに関数MyMailを提供するSendMail(MyMail.Mail)パッケージがあります。 MyMailは、パッケージLowLevelMailとその関数Send(LowLevelMail.Mail)を使用して、実際にメールを送信します。 MyMail.MailLowLevelMail.Mailは、「同じ構造体」(つまり、名前と型が同じフィールド)を定義するという意味で同一です。

SendMail(m MyMail.Mail)は、mを使用する前にLowLevelMail.MailSend(LowLevelMail.Mailに変換する必要があります。 newmail := LowLevelMail.Mail(m)は機能しません。しかし、コンパイラは2つの構造体のフィールドが同一であることを確認できるはずなので、これは可能かもしれません。フィールドがエクスポートされないため、これをサポートすることはお勧めできません。

1)手ですべてを行うことなく(そしてすべてのタイプセーフを失うことなく)、mnewmailに割り当てることができますか?手作業の方法では、多少の問題が発生します(構造体は、他の構造体に割り当てることができる単純な型だけで構成されるわけではありません)。

2)問題全体に対するより良い解決策はありますか(「パッケージのクライアントが外部APIに依存することを望まないため、APIで他のパッケージのタイプを使用したくありません。この外部APIは変更される可能性があります。または、ある時点でそれを使用しないことを決定するかもしれません。」)。

更新:重要なポイントを逃しました:LowLevelMail.MailにはLowLevelMail.Address型のフィールドがあり、これもMyMailMyMail.Addressとして「再定義」されています。
答え
これは機能します:

type T1 struct {
    a int
    b string
}
type T2 struct {
    a int
    b string
}
func main() {
    t1 := T1{2, "test"}
    t2 := T2(t1)
    fmt.Println(t2)
}


あなたが探しているものではありませんか?

T1とT2が異なるパッケージにあり、それらのフィールドをエクスポートしない場合にこれを行う方法について質問がある場合は、これを許可すると、これらのフィールドのプライバシーが無効になるだけなので、もちろん不可能です。
関連記事

xml - goでxml属性を抽出する

google-app-engine - 親エンティティによるデータストア結果のフィルタリング

go - GoogleドライブSDK v2のGoクライアント

windows - GoおよびCOM / ActiveX

go - ZeroMQを使用してGoで割り込みを処理する慣用的な方法

websocket - Golangを使用したクロスオリジンWebソケット

xml - Goの要素の任意のXML属性をマーシャルしますか?

map - goでのマップの型変換

inheritance - 別の形式でインターフェースを実装する

memory - Go:マップキーを再利用する場合のメモリ使用量の増加