go - 将一个结构分配给 "structural identical"类型的另一结构

标签 go

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

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

1) 我可以以某种方式分配 mnewmail无需手动完成所有操作(并且不会失去所有类型安全性?)?手动方法会带来一些麻烦(该结构不仅仅包含可以分配给其他结构的简单类型)。

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/

相关文章:

go - 在golang中传递字符串参数

go - 加载多个 gojsonschemas 供以后使用

sql - Postgres无限 self 加入

go - 将 .go-file 作为附加参数传递给 `go run`

go - 为什么 floats 和 ints = Nan?在去

go - 如何让 golang 中的解码函数处理多种类型?

postgresql - Postgres 中的 Go 和 IN 子句

go - 图像调整大小而不拉伸(stretch)和收缩

Go 应用程序在 NGINX 代理 : HTTP 502 后面不工作

Go 子包函数未正确导入