我的问题是这样的:我有一个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
中被“重新定义”如MyMail.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 位于不同的包中并且不导出其字段时如何执行此操作,那么允许这样做只会使这些字段的隐私无效,所以这当然是不可能的。
关于go - 将一个结构分配给 "structural identical"类型的另一结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420321/