我的问题的其他结构是这样的:我有一个MyMail
包,它提供了一个函数SendMail(MyMail.Mail)
到其他包。 MyMail
使用包LowLevelMail
,其功能Send(LowLevelMail.Mail)
实际发送邮件。 MyMail.Mail
和LowLevelMail.Mail
是相同的意义上,它们定义了“相同结构”(即同样名称和类型的字段)。分配一个结构来“结构相同”类型
SendMail(m MyMail.Mail)
必须在使用Send(LowLevelMail.Mail
之前将m
转换为LowLevelMail.Mail
。 newmail := LowLevelMail.Mail(m)
将不起作用。但是这可能是可能的,因为编译器应该能够看到两个结构的字段是相同的。也许这不是一个好主意,因为没有导出的字段支持这个。
1)我能以某种方式将m
分配给newmail
而不用手工完成(并且不会丢失所有类型的安全性?)?手工方法会造成一些痛苦(结构不仅仅包含可以分配给其他结构的简单类型)。
2)是否有更好的解决问题的全部(即“我不想让我的API类型,因为我不希望我的包使用其他套餐的客户依赖于外国API。这外国的API可能会改变,或者我可能会决定不再使用它。“)。
更新:我错过了一个重要的观点:LowLevelMail.Mail
具有LowLevelMail.Address
类型也被MyMail
“重新定义”为MyMail.Address
的领域。
我可以手工做,所以编译器能过。它可以简单地忽略隐藏的字段。 – Christian
对于不平凡的转换这样的,我想边说constructor'服用其他类型参数的值会比要求的隐式和神奇的复制和转换干净多了。 –