type identity的规则规定:
Two named types are identical if their type names originate in the same TypeSpec
我不太明白两个类型名称是如何在同一个TypeSpec中产生的。你能解释一下或给我看一个例子吗?
答案 0 :(得分:7)
只有一个类型名称可以来自TypeSpec。这就是重点。所以
type Foo int64
var x Foo
var y Foo
然后两个Foo
都来自同一个TypeSpec,因此它们是相同的Foo
s。
但是,如果您有两个不同的文件(在不同的包中):
a.go:
type Foo int64
var x Foo
b.go:
type Foo int64
var y Foo
然后在这种情况下两个Foo
不相同。即使它们是相同的类型名称,它们也来自不同的TypeSpecs。这样做的结果是x
和y
的类型不相同(因此不允许在没有强制转换的情况下x = y
。)
答案 1 :(得分:0)
Two named types are identical if their type names originate in the same TypeSpec
实际上,在Go代码中不能有两个相同的命名类型。因为在Go代码中,originate in the same TypeSpec
表示相同的类型。说一种类型与自身相同是毫无意义的。
但是我们确实有不同的命名类型,它们是相同的:byte和uint8;根据,符文和int32 the spec
只能在编译器中为预先声明的类型执行此操作。
请参阅the discussion in golang nuts
注意: 在Go 1.9中,将会有一个名为:type alias / alias声明的新功能。使用此功能,可以声明相同的不同命名类型。请参阅talk about Go 1.9