2

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

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

1)手動ですべてを実行せずに(そしてすべての型の安全性を失わずに)どうにかして割り当てることはできますmnewmail? 手作業による方法では、多少の苦痛が生じます (構造体は、他の構造体に割り当てることができる単純な型だけで構成されているわけではありません)。

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

更新:重要な点を見逃していました: asで「再定義」されているLowLevelMail.Mailtype のフィールドがあります。LowLevelMail.AddressMyMailMyMail.Address

4

2 に答える 2

1

これは機能します:

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

于 2012-09-14T08:38:50.783 に答える
1

あなたの問題は次のようなものです:

package lowlevelmail

type Mail struct { P int; p int}

func Send(m Mail) { }

package mymail

import "lowlevelmail"

type Mail lowlevelmail.Mail

func Send(m Mail) { lowlevelmail.Send(lowlevelmail.Mail(m)) }

package main

import "mymail"

func main() {var m mymail.Mail; mymail.Send(m)}
于 2012-09-14T08:44:17.070 に答える