我的问题是这样的:我有一个MyMail软件包,该软件包为其他软件包提供了SendMail(MyMail.Mail)函数。 MyMail使用软件包LowLevelMail及其功能Send(LowLevelMail.Mail)实际发送邮件。 MyMail.MailLowLevelMail.Mail在定义“相同结构”(即同名字段和键入字段)的意义上是相同的。
SendMail(m MyMail.Mail)必须在使用m之前将LowLevelMail.Mail转换为Send(LowLevelMail.Mailnewmail := 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/

10-10 16:53