我的问题是这样的:我有一个为其他包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)
1)我可以在不手动完成所有操作的情况下以某种方式分配m
(newmail
并且不会失去所有类型安全性?)?手动方法会引起一些痛苦(结构不仅仅包含可以分配给其他结构的简单类型)。
2) 整个问题是否有更好的解决方案(即“我不想在我的 API 中使用其他包的类型,因为我不希望我的包的客户端依赖于外部 API。这个外部 API 可能会改变或者我可能会在某个时候决定不再使用它。”)。
更新:我错过了一个重要的点:LowLevelMail.Mail
有一个类型的字段,LowLevelMail.Address
它也在MyMail
as中“重新定义” MyMail.Address
。