为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的类型别名与类型定义

Go 中的类型别名与类型定义

Go
泛舟湖上清波郎朗 2023-06-05 09:12:30
我在代码中偶然发现了这种类型别名:type LightSource = struct {  R, G, B, L float32  X, Y, Z, A float32  //...}我的问题是:使用这样的类型别名来定义 astruct而不是这样做的原因是什么?type LightSource struct {  R, G, B, L float32  //...etc}
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2023-06-05
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我发现类型别名对可读性很有用。例如,在测试中,您可能会像这样比较 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 失败。


查看完整回答
反对 回复 2023-06-05
?
当年话下

TA贡献1890条经验 获得超9个赞

为了补充 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,并且你使用错误的类型别名方式,你将结束对您的“类型别名”绝对零限制;如果您最终创建了类型别名,最终目标实际上是区分您的类型,但如果您犯了这个错误,那显然是无效的。


查看完整回答
反对 回复 2023-06-05
  • 3 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信