【问题标题】:Type alias vs type definition in GoGo 中的类型别名与类型定义
【发布时间】:2019-06-21 11:52:03
【问题描述】:

我在代码中偶然发现了这种类型别名:

type LightSource = struct {
  R, G, B, L float32
  X, Y, Z, A float32
  //...
}

我的问题是:使用这样的类型别名来定义struct,而不是这样做的原因是什么?

type LightSource struct {
  R, G, B, L float32
  //...etc
}

【问题讨论】:

    标签: go type-alias


    【解决方案1】:

    在这种情况下,我假设这是错误地完成的——第一个替代方案定义了一个“匿名”类型,然后为其分配一个别名,因此两种情况下的最终结果是相同的,但第二个替代方案仍然是唯一的正确的一个。

    类型别名仅在少数情况下有用,例如正如here 所写,它们可用于大规模重构。

    【讨论】:

      【解决方案2】:

      我发现类型别名对可读性很有用。例如,在测试中,您可能会像这样比较 JSON 解码器的输出:

      reflect.DeepEqual(r, map[string]interface{}{"a": map[string]interface{}{"b": 42.0}})
      

      但您可以使用类型别名来提高可读性:

      type JsonObject = map[string]interface{}
      ...
      reflect.DeepEqual(r, JsonObject{"a": JsonObject{"b": 42.0}})
      

      因为 DeepEqual 使用反射来比较类型(和值),然后将类型别名作为类型定义(通过删除 = 字符)将导致 DeepEqual 失败。你可以在Go Playground试试看

      【讨论】:

        【解决方案3】:

        为了补充 Rob64 的答案,他指出最终结果是相同的,但不要误会您最终会得到两种不同类型的事实。

        type LightSource = struct { // Type struct
          R, G, B, L float32
          X, Y, Z, A float32
          //...
        }
        
        type LightSource struct { // Type LightSource
          R, G, B, L float32
          //...etc
        }
        

        我觉得你会得到一个不同的类型这一事实有很多混淆,这意味着如果你在代码中的某个地方强制使用类型 A,并且你使用了错误的类型别名方式,你' 最终对您的“类型别名”的限制绝对为零;如果你最终创建了一个类型别名,最终目标实际上是区分你的类型,但如果你犯了这个错误,那显然是无效的。

        Go play<<

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-04
          • 2013-07-06
          • 2014-01-12
          • 2016-04-10
          • 2018-05-11
          • 2020-03-29
          • 2016-07-17
          • 1970-01-01
          相关资源
          最近更新 更多