Go 将一个结构赋值给另一个结构;“结构相同”;类型

Go 将一个结构赋值给另一个结构;“结构相同”;类型,go,Go,我的问题是这样的:我有一个MyMail包,它向其他包提供了一个函数SendMail(MyMail.Mail)MyMail使用包LowLevelMail及其功能Send(LowLevelMail.Mail)实际发送邮件MyMail.Mail和LowLevelMail.Mail在定义“相同结构”(即相同名称和类型的字段)的意义上是相同的 SendMail(m MyMail.Mail)必须先将m转换为LowLevelMail.Mail,然后才能使用Send(LowLevelMail.Mailnewma

我的问题是这样的:我有一个
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
吗?by hand方法会带来一些麻烦(结构不只是由可以分配给其他结构的简单类型组成)

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

您的问题似乎是这样的:

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