2

我的问题是这样的:我有一个为其他包MyMail提供功能SendMail(MyMail.Mail)的包。MyMail使用包LowLevelMail及其功能Send(LowLevelMail.Mail)来实际发送邮件。MyMail.Mail并且LowLevelMail.Mail在它们定义“相同结构”(即同样命名和类型化的字段)的意义上是相同的。

SendMail(m MyMail.Mail)使用前必须转换m为. 不会工作。但这可能是可能的,因为编译器应该能够看到两个结构的字段是相同的。由于未导出字段,因此支持这一点可能不是一个好主意。LowLevelMail.MailSend(LowLevelMail.Mailnewmail := LowLevelMail.Mail(m)

1)我可以在不手动完成所有操作的情况下以某种方式分配mnewmail并且不会失去所有类型安全性?)?手动方法会引起一些痛苦(结构不仅仅包含可以分配给其他结构的简单类型)。

2) 整个问题是否有更好的解决方案(即“我不想在我的 API 中使用其他包的类型,因为我不希望我的包的客户端依赖于外部 API。这个外部 API 可能会改变或者我可能会在某个时候决定不再使用它。”)。

更新:我错过了一个重要的点:LowLevelMail.Mail有一个类型的字段,LowLevelMail.Address它也在MyMailas中“重新定义” MyMail.Address

4

2 回答 2

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

于 2012-09-14T08:38:50.783 回答
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)}
于 2012-09-14T08:44:17.070 回答