猿问

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

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


type LightSource = struct {

  R, G, B, L float32

  X, Y, Z, A float32

  //...

}

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


type LightSource struct {

  R, G, B, L float32

  //...etc

}


泛舟湖上清波郎朗
浏览 125回答 3
3回答

一只名叫tom的猫

在这种情况下,我假设这是错误完成的——第一种选择“匿名”定义了一个类型,然后为其分配了一个别名,因此两种情况下的最终结果是相同的,但第二种选择仍然是唯一正确的选择。类型别名仅在少数情况下有用,例如,如此处所写,它们可用于大规模重构。

汪汪一只猫

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

当年话下

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

相关分类

Go
我要回答