【问题标题】:Assignment of one struct to other struct of "structural identical" type将一个结构分配给“结构相同”类型的另一个结构
【发布时间】:2012-09-14 07:58:05
【问题描述】:

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

【问题讨论】:

    标签: go


    【解决方案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 位于不同的包中并且不导出其字段时如何执行此操作,那么,允许这样做只会使这些字段的隐私无效,所以这当然是不可能的。

    【讨论】:

    • 我可以手动完成,所以编译器也可以。它可以简单地忽略隐藏字段。
    【解决方案2】:

    您的问题似乎是这样的:

    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)}
    

    【讨论】:

    • 感谢您的回答,但不幸的是,这对我不起作用。在问题中查看我的更新。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2019-03-18
    • 2017-10-20
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多