2012-09-14 113 views
2

我的问题的其他结构是这样的:我有一个MyMail包,它提供了一个函数SendMail(MyMail.Mail)到其他包。 MyMail使用包LowLevelMail,其功能Send(LowLevelMail.Mail)实际发送邮件。 MyMail.MailLowLevelMail.Mail是相同的意义上,它们定义了“相同结构”(即同样名称和类型的字段)。分配一个结构来“结构相同”类型

SendMail(m MyMail.Mail)必须在使用Send(LowLevelMail.Mail之前将m转换为LowLevelMail.Mailnewmail := LowLevelMail.Mail(m)将不起作用。但是这可能是可能的,因为编译器应该能够看到两个结构的字段是相同的。也许这不是一个好主意,因为没有导出的字段支持这个。

1)我能以某种方式将m分配给newmail而不用手工完成(并且不会丢失所有类型的安全性?)?手工方法会造成一些痛苦(结构不仅仅包含可以分配给其他结构的简单类型)。

2)是否有更好的解决问题的全部(即“我不想让我的API类型,因为我不希望我的包使用其他套餐的客户依赖于外国API。这外国的API可能会改变,或者我可能会决定不再使用它。“)。

更新:我错过了一个重要的观点:LowLevelMail.Mail具有LowLevelMail.Address类型也被MyMail“重新定义”为MyMail.Address的领域。

回答

1

这工作:

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是在不同的软件包中,并且不导出他们的字段,那么,允许这将简单地取消这些字段的隐私,所以当然这是不可能的。

+0

我可以手工做,所以编译器能过。它可以简单地忽略隐藏的字段。 – Christian

+3

对于不平凡的转换这样的,我想边说constructor'服用其他类型参数的值会比要求的隐式和神奇的复制和转换干净多了。 –

1

你的问题似乎是这样的:

package lowlevelmail 

type Mail struct { P int; p int} 

func Send(m Mail) { } 

package mymail 

import "lowlevelmail" 

type Mail lowlevelmail.Mail 

func Send(m Mail) { lowlevelmail.Send(lowlevelmail.Mail(m)) } 

package main 

import "mymail" 

func main() {var m mymail.Mail; mymail.Send(m)} 
+0

感谢您的回答,但不幸的是这对我无效。看到我的问题更新。 – Christian