我的问题是这样的:我有一个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/