【问题标题】:Assigning a struct (Having one of its fields as a struct) to another struct using the feature introduced in Go 1.8使用 Go 1.8 中引入的特性将一个结构(将其中一个字段作为结构)分配给另一个结构
【发布时间】:2017-06-21 01:04:26
【问题描述】:

我知道,从 Go 1.8 开始,可以将一个结构分配给另一种结构类型,如下所示:

func example() { type T1 struct { X intjson:"foo" } type T2 struct { X intjson:"bar" } var v1 T1 var v2 T2 v1 = T1(v2) // now legal }

但是,如果结构内部有一个字段作为另一个结构,则它不起作用。

游乐场:https://play.golang.org/p/tSHdjBhhAJ

在这种情况下,除了手动分配每个字段之外,分配 2 个结构的最佳方法是什么?

这不是Assign struct with another struct 的重复,因为在这里,您将一个结构分配给另一个相同类型的结构。但是我想要的是分配两个具有相同字段名称的不同结构。

【问题讨论】:

  • 新的 Go 1.8 功能仅在结构具有相同的字段名称和 types 时才有效。尽管您的 Test2 和 Test4 结构在字段上是相同的,但它们是两种不同的类型,因此编译器不允许对其进行赋值。有人可能会争辩说,应该对结构进行深度比较而不是简单的类型比较,但这不是目前实现的方式。您有三个选择:在每个结构字段中使用相同的结构类型,在每个结构中使用匿名结构 (play.golang.org/p/Hw7HANwqbZ),或者创建一个辅助函数来手动转换两者。
  • 重新打开。 @Kaedys 想把它作为答案发布吗?
  • 转贴为答案。

标签: go struct


【解决方案1】:

新的 Go 1.8 功能仅在结构具有相同的字段名称和 类型 时才有效。尽管您的 Test2 和 Test4 结构在字段上是相同的,但它们是两种不同的类型,因此编译器不允许对其进行赋值。有人可能会争辩说,应该对结构进行深度比较而不是简单的类型比较,但这不是目前实现的方式。您有三个选择:在每个结构字段中使用相同的结构类型,在每个结构中使用匿名结构 (https://play.golang.org/p/Hw7HANwqbZ),或者创建一个辅助函数来手动转换两者。

目前有一个提议允许在没有逐字段帮助方法的情况下转换深度等效结构,但目前计划用于 Go 2.x:https://github.com/golang/go/issues/20621

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2012-07-29
    相关资源
    最近更新 更多